Regex 正则表达式中必须转义哪些特殊字符?
我厌倦了总是试图猜测,在使用许多regexp实现时,我是否应该转义特殊字符,如“Regex 正则表达式中必须转义哪些特殊字符?,regex,Regex,我厌倦了总是试图猜测,在使用许多regexp实现时,我是否应该转义特殊字符,如“()[]{}}”等 它与Python、sed、grep、awk、Perl、rename、Apache、find等不同。 是否有任何规则集告诉我什么时候应该和什么时候不应该转义特殊字符?它是否取决于regexp类型,如PCRE、POSIX或扩展regexp?实际上,没有。大约有五百万个不同的正则表达式语法;它们似乎可以归结为Perl、EMACS/GNU和AT&T,但我也总是感到惊讶。不幸的是,实际上没有一组转义代码,因
()[]{}}
”等
它与Python、sed、grep、awk、Perl、rename、Apache、find等不同。
是否有任何规则集告诉我什么时候应该和什么时候不应该转义特殊字符?它是否取决于regexp类型,如PCRE、POSIX或扩展regexp?实际上,没有。大约有五百万个不同的正则表达式语法;它们似乎可以归结为Perl、EMACS/GNU和AT&T,但我也总是感到惊讶。不幸的是,实际上没有一组转义代码,因为它随您使用的语言而异
但是,保留这样的页面可以帮助您快速筛选出内容。不幸的是,(和\)等内容的含义在Emacs样式的正则表达式和大多数其他样式之间交换。因此,如果您试图避开这些,您可能会做与您所希望相反的事情
因此,您必须知道您要引用的是什么样式。POSIX识别正则表达式的多种变体-基本正则表达式(BRE)和扩展正则表达式(ERE)。即使如此,由于POSIX标准化的实用程序的历史实现,仍然存在一些怪癖 对于何时使用哪种表示法,甚至给定命令使用哪种表示法,没有简单的规则
查看Jeff Friedl的书。有时,对列出的字符进行简单的转义是不可能的。例如,在sed中,使用反斜杠转义括号在替换字符串的左侧是行不通的,即
sed -e 's/foo\(bar/something_else/'
我倾向于只使用一个简单的字符类定义,因此上面的表达式变得
sed -e 's/foo[(]bar/something_else/'
我发现它适用于大多数regexp实现
顺便说一句,字符类是非常普通的regexp组件,因此它们往往适用于在regexp中需要转义字符的大多数情况
< >编辑:下面的评论,我想我提到的事实是,当你查看ReGEXP评估的行为时,你也必须考虑有限状态自动机和非有限状态自动机之间的区别。 您可能想看看“闪亮的球书”aka Effective Perl(),特别是关于正则表达式的一章,以了解regexp引擎求值类型的差异
不是全世界都是PCRE 不管怎么说,regexp与!现在相比太笨重了,是一门有趣的编程课程啊,70年代末在新南威尔士大学学习的乐趣!(:哪些角色你必须扮演,哪些角色你不能逃避,这确实取决于你所使用的正则表达式的风格 对于PCRE和大多数其他所谓的Perl兼容风格,转义这些外部字符类:
.^$*+?()[{\|
^-]\
还有这些内部字符类:
.^$*+?()[{\|
^-]\
对于POSIX扩展正则表达式(ERE),转义这些外部字符类(与PCRE相同):
转义任何其他字符是POSIX ERE的错误
在字符类中,反斜杠是POSIX正则表达式中的文字字符。您不能使用它转义任何内容。您必须使用“巧妙的放置”如果要将字符类元字符作为文字包含在内,请将“^”放在字符类开头以外的任何位置,将“]放在字符类开头或结尾,以便按字面形式匹配这些字符,例如:
[]^-]
在POSIX基本正则表达式(BRE)中,这些是需要转义以抑制其含义的元字符:
.^$*[\
BRE中的转义括号和花括号赋予它们在ERE中未转义版本的特殊含义。某些实现(例如GNU)在转义时也赋予其他字符特殊含义,例如\?和+。转义除.^$*(){}以外的字符通常是BRE的错误
在字符类中,BRE遵循与ERE相同的规则
如果所有这些都让你头晕目眩,那么抓起一个副本。在“创建”选项卡上,单击“插入标记”,然后单击“文字”。RegexBuddy将根据需要添加转义符。对于PHP,“在非字母数字前面加上“\”以指定它代表它本身总是安全的。”-
除非是“或”。:/
要在PHP中转义正则表达式模式变量(或部分变量),请使用preg_quote()Modern regex Flavors(PCRE)
包括C、C++、Delphi、EdjPad、java、JavaScript、Perl、PHP(PREG)、PostgreSQL、PowerGREP、PosithSealPython、Python、REALbasic、Real RealStudio、Ruby、TCL、VB.NET、VBScript、WxWIDGet、XML Schema、Xojo、XRegExp。 任何地方:
^$*+-?()[]{}\|
传统正则表达式口味(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(它们必须仅在需要时转义)。对于PCRE
,只需要在字符类中转义,但为了简单起见,我将它们保留在单个列表中]-
-
"^(?=.*[\\]\\[!¡\'=ªº\\-\\_ç@#$%^&*(),;\\.?\":{}|<>\+\\/])"
def listToString(s): # initialize an empty string str1 = "" # return string return (str1.join(s)) r = "Hello! How are you? *Smiling_Face* *Heart* erwer" r1 = list(r) i = 0 r2 = list() start = True for string in r1: if string == "*": if(start): start = False else: start = True else: if(start): r2.append(string) else: print("skipped" + string) print(listToString(r2))