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

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


当前回答

哪些字符必须转义,哪些字符不能转义,实际上取决于您使用的正则表达式类型。

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

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

这些内部字符类:

^-]\

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

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

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

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

[]^-]

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

.^$*[\

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

在字符类内部,bre遵循与EREs相同的规则。

如果所有这些使您头晕目眩,请获取RegexBuddy的副本。在“创建”选项卡上,单击“插入令牌”,然后单击“文字”。RegexBuddy将根据需要添加转义。

其他回答

现代正则表达式口味(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。PCRE兼容性可能有所不同

不会后悔:。^ $ * + - ?( ) [ ] { } \ |


传统RegEx口味(BRE/ERE)

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

纪念awk / egrep / emacs

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

BRE / ed / grep和sed

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


笔记

If unsure about a specific character, it can be escaped like \xFF Alphanumeric characters cannot be escaped with a backslash Arbitrary symbols can be escaped with a backslash in PCRE, but not BRE/ERE (they must only be escaped when required). For PCRE ] - only need escaping within a character class, but I kept them in a single list for simplicity Quoted expression strings must also have the surrounding quote characters escaped, and often with backslashes doubled-up (like "(\")(/)(\\.)" versus /(")(\/)(\.)/ in JavaScript) Aside from escapes, different regex implementations may support different modifiers, character classes, anchors, quantifiers, and other features. For more details, check out regular-expressions.info, or use regex101.com to test your expressions live

不幸的是,确实没有一组转义码,因为它根据您使用的语言而变化。

然而,保留一个像正则表达式工具页面或这个正则表达式小抄表这样的页面可以帮助你快速过滤东西。

对于Ionic (Typescript),你必须用双斜杠来转义字符。 例如(这是为了匹配一些特殊字符):

"^(?=.*[\\]\\[!¡\'=ªº\\-\\_ç@#$%^&*(),;\\.?\":{}|<>\+\\/])"

注意这个]- _。/字符。它们必须被一分为二。如果不这样做,代码中就会出现类型错误。

POSIX识别正则表达式的多种变体——基本正则表达式(BRE)和扩展正则表达式(ERE)。即使这样,由于POSIX标准化的实用程序的历史实现,也存在一些怪癖。

对于何时使用哪种符号,甚至给定命令使用哪种符号,并没有一个简单的规则。

看看Jeff Friedl的《精通正则表达式》这本书。

哪些字符必须转义,哪些字符不能转义,实际上取决于您使用的正则表达式类型。

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

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

这些内部字符类:

^-]\

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

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

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

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

[]^-]

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

.^$*[\

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

在字符类内部,bre遵循与EREs相同的规则。

如果所有这些使您头晕目眩,请获取RegexBuddy的副本。在“创建”选项卡上,单击“插入令牌”,然后单击“文字”。RegexBuddy将根据需要添加转义。