我厌倦了总是试图猜测,如果我()[]{}|
在使用许多regexp实现时应该逃避像'等等特殊字符.
它与例如Python,sed,grep,awk,Perl,rename,Apache,find等不同.是否有任何规则集告诉我何时应该,何时不应该逃避特殊字符?它是否依赖于正则表达式类型,如PCRE,POSIX或扩展正则表达式?
您必须使用哪些角色以及哪些角色确实无法逃脱取决于您正在使用的正则表达式.
对于PCRE以及大多数其他所谓的Perl兼容版本,请忽略这些外部字符类:
.^$*+?()[{\|
以及这些内部角色类:
^-]\
对于POSIX扩展正则表达式(ERE),请转义这些外部字符类(与PCRE相同):
.^$*+?()[{\|
使用POSIX ERE时,转义任何其他字符都是错误的.
在字符类内部,反斜杠是POSIX正则表达式中的文字字符.你不能用它来逃避任何事情.如果要将字符类元字符包含为文字,则必须使用"巧妙放置".将^除了在开头处,在开头处,以及 - 在字符类的开头或结尾处 - 在字面上匹配这些,例如:
[]^-]
在POSIX基本正则表达式(BRE)中,这些是元字符,您需要转义以抑制其含义:
.^$*[\
在BRE中转义括号和大括号使它们具有非转义版本在ERE中的特殊含义.某些实现(例如GNU)在转义时也会为其他字符赋予特殊含义,例如\?和+.转义.^ $*(){}以外的字符通常是BRE的错误.
在内部角色类中,BRE遵循与ERE相同的规则.
如果这一切让你头晕目眩,那就抓住RegexBuddy的副本吧.在"创建"选项卡上,单击"插入标记",然后单击"文字".RegexBuddy将根据需要添加转义.
包括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兼容性可能有所不同
任何地方: . ^ $ * + - ? ( ) [ ] { } \ |
包括awk,ed,egrep,emacs,GNUlib,grep,PHP(ereg),MySQL,Oracle,R,sed.
可以在更高版本中或通过使用扩展来启用PCRE支持
ERE/AWK/egrep的/ emacs的
在角色类之外:. ^ $ * + ? ( ) [ { } \ |
在角色类中:^ - [ ]
BRE/ED/grep的/ SED
在字符类之外:. ^ $ * [ \
在字符类中:^ - [ ]
对于文字,不要转义:+ ? ( ) { } |
对于标准正则表达式行为,转义:\+ \? \( \) \{ \} \|
如果不确定某个特定字符,可以将其转义为 \xFF
无法使用反斜杠转义字母数字字符
可以使用PCRE中的反斜杠转义任意符号,但不能转义BRE/ERE(必须在必要时转义它们).对于PCRE,] -
只需要在字符类中进行转义,但为了简单起见,我将它们保存在单个列表中
引用的表达式字符串也必须包含转义的周围引号字符,并且通常使用反斜杠加倍("(\")(/)(\\.)"
与/(")(\/)(\.)/
JavaScript 相比)
除了转义之外,不同的正则表达式实现可以支持不同的修饰符,字符类,锚点,量词和其他功能.有关详细信息,请regular-expressions.info,或使用regex101.com来测试你的表情生活
遗憾的是,实际上没有一组转义码,因为它根据您使用的语言而有所不同.
但是,保留像正则表达式工具页面或此正则表达式备忘单这样的页面可以帮助您快速筛选出来.
POSIX可以识别正则表达式的多种变体-基本正则表达式(BRE)和扩展正则表达式(ERE)。即便如此,由于POSIX标准化实用程序的历史实现,仍然存在一些奇怪之处。
对于何时使用哪种表示法,甚至给定命令使用哪种表示法,没有一个简单的规则。
查阅Jeff Friedl的《精通正则表达式》一书。