什么特殊字符必须在正则表达式中转义?

我厌倦了总是试图猜测,如果我应该逃避像' ()[]{}|这样的特殊字符 '等使用正则表达式的许多实现。

例如,它与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会根据需要添加转义。


现代RegEx香料(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支持可能在更高版本中或通过使用扩展启用

ERE / AWK / egrep的/ emacs的

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

BRE / ED / grep的/ SED

在角色等级之外: . ^ $ * [ . ^ $ * [
在字符类中: ^ - [ ]
对于文字,不要逃避: + ? ( ) { } | + ? ( ) { } |
对于标准的正则表达式行为,转义: + ? ( ) { } | + ? ( ) { } |


笔记

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

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

    但是,保留一个像正则表达式工具页面或这个正则表达式Cheatsheet的页面可以帮助您快速过滤出来。

    链接地址: http://www.djcxy.com/p/95197.html

    上一篇: What special characters must be escaped in regular expressions?

    下一篇: Accent insensitive search query in MySQL