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

2024-04-19 23:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我厌倦了在使用许多regexp实现时,总是试图猜测是否应该转义诸如()[]{}|等特殊字符。

它不同于Python、sed、grep、awk、Perl、rename、Apache、find等等。 有什么规则集告诉我什么时候应该,什么时候不应该,转义特殊字符吗?它是否依赖于regexp类型,如PCRE、POSIX或扩展regexps?


Tags: 类型规则apachefindgrepsedperlposix
3条回答

不幸的是,实际上并没有一组转义代码,因为它根据您使用的语言而有所不同。

然而,保持像Regular Expression Tools Page或这个Regular Expression Cheatsheet这样的页面可以帮助您快速过滤出问题。

现代RegEx香精(PCRE)

< SUP>包括C、C++、Delphi、EdjPad、java、JavaScript、Perl、PHP(PREG)、PostgreSQL、PowerGREP、POWECK、Python、REALbasic、Real RealStudio、Ruby、TCL、VB.NET、VBScript、WxWIDGet、XML Schema、Xojo、XRegExp。

任何位置:. ^ $ * + - ? ( ) [ ] { } \ |


传统RegEx口味(BRE/ERE)

包括awk、ed、egrep、emacs、GNUlib、grep、PHP(ereg)、MySQL、Oracle、R、sed。
PCRE支持可以在以后的版本中启用,也可以通过使用扩展来启用

ERE/awk/egrep/emacs

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

BRE/ed/grep/sed

在字符类之外:. ^ $ * [ \
在字符类中:^ - [ ]
对于文本,不要转义:+ ? ( ) { } |
对于标准正则表达式行为,escape:\+ \? \( \) \{ \} \|


注释

  • 如果不确定特定字符,可以像\xFF那样对其进行转义
  • 字母数字字符不能用反斜杠转义
  • 在PCRE中,可以用反斜杠转义任意符号,但不能用BRE/ERE转义(只有在需要时才能转义)。For PCRE ] -只需要在字符类中转义,但为了简单起见,我将它们保存在一个列表中
  • 带引号的表达式字符串还必须对周围的引号字符进行转义,并且通常反斜杠要加倍(如JavaScript中的"(\")(/)(\\.)"/(")(\/)(\.)/
  • 除了转义之外,不同的regex实现可能支持不同的修饰符、字符类、锚、量词和其他特性。有关详细信息,请签出regular-expressions.info,或使用regex101.com实时测试表达式

哪些字符是必须的,哪些字符不能转义取决于使用的regex类型。

对于PCRE和大多数其他所谓的Perl兼容类型,请转义这些外部字符类:

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

这些内部字符类:

^-]\

对于POSIX扩展正则表达式(ERE),转义这些外部字符类(与PCRE相同):

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

转义任何其他字符是POSIX ERE的一个错误。

在字符类中,反斜杠是POSIX正则表达式中的文字字符。你不能用它来逃避任何事情。如果要将字符类元字符包含为文本,则必须使用“巧妙的位置”。将“^”放在字符类开头以外的任何地方,将“]放在开头,将“-”放在字符类的开头或结尾,以便按字面意思匹配这些字符,例如:

[]^-]

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

.^$*[\

BREs中的转义括号和花括号赋予了它们在EREs中的特殊含义。一些实现(例如GNU)在转义时也给其他字符赋予了特殊的含义,例如?和+。转义.^$*({})以外的字符通常是BREs的错误。

在字符类中,BREs遵循与EREs相同的规则。

如果这一切让你头晕目眩,拿一份RegexBuddy。在“创建”选项卡上,单击“插入标记”,然后单击“文字”。RegexBuddy将根据需要添加转义。

相关问题 更多 >