我厌倦了总是试图猜测,如果我()[]{}|在使用许多regexp实现时应该逃避像'等等特殊字符.
它与例如Python,sed,grep,awk,Perl,rename,Apache,find等不同.是否有任何规则集告诉我何时应该,何时不应该逃避特殊字符?它是否依赖于正则表达式类型,如PCRE,POSIX或扩展正则表达式?
Jan*_*rts 348
您必须使用哪些角色以及哪些角色确实无法逃脱取决于您正在使用的正则表达式.
对于PCRE以及大多数其他所谓的Perl兼容版本,请忽略这些外部字符类:
.^$*+?()[{\|
Run Code Online (Sandbox Code Playgroud)
以及这些内部角色类:
^-]\
Run Code Online (Sandbox Code Playgroud)
对于POSIX扩展正则表达式(ERE),请转义这些外部字符类(与PCRE相同):
.^$*+?()[{\|
Run Code Online (Sandbox Code Playgroud)
使用POSIX ERE时,转义任何其他字符都是错误的.
在字符类内部,反斜杠是POSIX正则表达式中的文字字符.你不能用它来逃避任何事情.如果要将字符类元字符包含为文字,则必须使用"巧妙放置".将^除了在开头处,在开头处,以及 - 在字符类的开头或结尾处 - 在字面上匹配这些,例如:
[]^-]
Run Code Online (Sandbox Code Playgroud)
在POSIX基本正则表达式(BRE)中,这些是元字符,您需要转义以抑制其含义:
.^$*[\
Run Code Online (Sandbox Code Playgroud)
在BRE中转义括号和大括号使它们具有非转义版本在ERE中的特殊含义.某些实现(例如GNU)在转义时也会为其他字符赋予特殊含义,例如\?和+.转义.^ $*(){}以外的字符通常是BRE的错误.
在内部角色类中,BRE遵循与ERE相同的规则.
如果这一切让你头晕目眩,那就抓住RegexBuddy的副本吧.在"创建"选项卡上,单击"插入标记",然后单击"文字".RegexBuddy将根据需要添加转义.
Bee*_*jor 57
包括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] -只需要在字符类中进行转义,但为了简单起见,我将它们保存在单个列表中"(\")(/)(\\.)"与/(")(\/)(\.)/JavaScript 相比)不幸的是,像 ( 和 \( 之类的东西的含义在 Emacs 样式正则表达式和大多数其他样式之间交换。因此,如果您试图逃避这些,您可能会做与您想要的相反的事情。
所以你真的必须知道你要引用什么风格。