正则表达式中必须转义哪些特殊字符?

41 浏览
0 Comments

正则表达式中必须转义哪些特殊字符?

我已经厌倦了尝试猜测是否应该在使用许多正则表达式实现时逃避特殊字符如 \'()[]{}|\' 等。

与例如 Python、sed、grep、awk、Perl、rename、Apache、find 等不同。

是否有规则集告诉我何时应该,何时不应该逃避特殊字符?是否取决于正则表达式类型,像 PCRE、 POSIX 或扩展正则表达式?

admin 更改状态以发布 2023年5月24日
0
0 Comments

现代正则表达式( PCRE )

包括C、C++、Delphi、EditPad、Java、JavaScript、Perl、PHP(preg)、PostgreSQL、PowerGREP、PowerShell、Python、REALbasic、Real Studio、Ruby、TCL、VB.Net、VBScript、wxWidgets、XML Schema、Xojo、XRegExp。 < br/ >PCRE 的兼容性可能会有所不同。

    在任何地方 : . ^ $ * + - ? ( ) [ ] { } \ |


遗留正则表达式(BRE/ERE)

包括 awk、ed、egrep、emacs、GNUlib、grep、PHP(ereg)、MySQL、Oracle、R、sed。 < br/ >PCRE 的支持可能在以后的版本中启用,或者使用扩展也可以启用。

ERE/awk/egrep/emacs

    在字符类外面:. ^ $ * + ? ( ) [ { } \ |
    在字符类里面:^ - [ ]

BRE/ed/grep/sed

    在字符类外面:. ^ $ * [ \
    在字符类里:^ - [ ]
    对于字符字面量,不要转义:+ ? ( ) { } |
    对于标准的正则表达式行为,需要转义:\+ \? \( \) \{ \} \|


注释

  • 如果不确定某个特定的字符,可以像\xFF这样转义
  • 字母数字字符不能用反斜杠转义
  • 在PCRE中,任意符号都可以用反斜杠转义,但在BRE/ERE中不行(只有在必要时才需要转义)。对于PCRE,] - 只需要在字符类中转义,但我为了简单起见将它们放在了一个列表中。
  • 引用的表达式字符串还必须用反斜杠转义周围的引号,并且通常需要双倍反斜杠(比如在 JavaScript 中,"(\")(/)(\\.)"/(")(\/)(\.)/相对应)。
  • 除了转义符,不同的正则表达式实现可能支持不同的修饰符、字符类、锚点、量化器和其他特性。要获取更多详细信息,请查阅regular-expressions.info,或使用regex101.com实时测试您的表达式。
0
0 Comments

必须转义哪些字符以及不能转义哪些字符,确实取决于你正在使用的正则表达式的风格。

对于PCRE和大多数其他所谓的Perl兼容风格,外部字符类应转义以下内容:

.^$*+?()[{\|

内部字符类应转义以下内容:

^-]\

对于POSIX扩展正则表达式(ERE),外部字符类应转义以下内容(与PCRE相同):

.^$*+?()[{\|

使用POSIX ERE转义任何其他字符都是错误的。

在字符类内,反斜杠是POSIX正则表达式中的字面字符。您不能使用它来转义任何内容。如果要将字符类元字符包含为文字,请使用“巧妙的放置”。在字符类中任何位置都可以放置^,放置]在开头,放置-在字符类的开头或结尾以文字匹配,例如:

[]^-]

在POSIX基本正则表达式(BRE)中,这些是元字符,您需要转义以抑制其含义:

.^$*[\

在BRE中,转义括号和大括号会使它们具有ERE中未转义版本的特殊含义。某些实现(例如GNU)在转义时也会赋予其他字符特殊意义,例如\?和+。转义除。^$*(){}以外的字符通常是BRE中的错误。

在字符类内,BRE遵循与ERE相同的规则。

如果所有这些内容让您感到头晕,那就获取RegexBuddy的副本。在“创建”选项卡上,单击“插入标记”,然后单击“字面量”。RegexBuddy将根据需要添加转义字符。

0