正则表达式和模式匹配简介——注释和模式变换
作者:张桂权
(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)
模式变化改变正则表达式引擎解释正则表达式的方式。(请参看MRE 110-113,135-136)
多行模式:m
改变^和$的行为来匹配输入字符串中紧挨的换行。
单行模式:s
改变点号(dot)的行为来匹配所有字符,包括输入字符串中的换行。
大小写敏感模式:i
以大小写来唯一区分字母的不同。
自由调整间隔(Free-spacing)模式:x
允许正则表达式中包含空格和注释。空格和注释(以#开始,到行末)被正则表达式引擎忽略。
模式变换器:(?!),(?-!),(?mod:...)
一般情况下,可以通过(?mod)在正则表达式中设置模式变换器,它在后续的子表达式中生效。(?-mod)取消后续子表达式中的模式。(?mod:...)启动或取消逗号和关括号之间的模式。比如,使用(?:perl)匹配使用perl,使用Perl,使用PeRl等。
注释:(?#...)和#
在自由调整间隔的模式下,#表示这是一行注释。当不支持#时,可以把(?#...)嵌入到正则表达式的任意位置,不论是什么模式。例如,.{0,80}(?#Field limit is 80)允许你就自己的改写原因做批注.{0,80}。
逐个文本跨度(Literal-text span):/Q...\E
在/Q和/E之间回避元字符。例如,/Q(.*)/E和/(/./*)等效。
分组、捕获、条件和控制
本节包括归类子模式、捕获子匹配、条件子匹配的语法和计算子模式匹配出现的次数。(请参看 MRE 137-142)
捕获和归类括号:(...)和/1,/2等
括号起到两个作用:归类和捕获。括号中被子模式匹配的文本将在后面使用。通过从左到右的方式计算开括号得到捕获括号的个数。如果允许向后引用,那么可以通过/1,/2等在同一个匹配中引用子匹配。对于捕获文本,可以通过依靠实现指定的方法来实现这种模式。例如,/b(/w+)/b/s+/1匹配重复的字,不如the the。
仅限于归类的括号:(?:…)
归类一个子正则表达式是为了变换或计量,而不是捕获一个子匹配。由于效率和高重用性,这一点非常有用。例如,(?:foobar)匹配foobar,但是不把它保存到一个捕获组中。
命名捕获:(?<name>…)
进行捕获和归类,然后用name了引用捕获的文本。例如,Subject:(?<subject>.*)捕获Subject之后的文本,并进行捕获归类,最后通过subject来引用文本。
自动归类:(?>…)
即使导致匹配失败,也从不回溯组中匹配的文本。例如,(?>[ab]*)/w/w匹配aabbcc,担不是aabbaa。
替换:… | …
允许测试几个子表达式。替换低优先级有时可能造成子表达式比预期的还要大很多,所以最好用括号指定你想要替换的内容。例如,/b(foo|bar)/b匹配foo或bar。
条件:(?(if)then |else)
If依赖于具体的实现,不过通常是捕获子表达式或环顾(lookaround)的引用。而then和else都是正则表达式模式。当if条件为真时,引用then,否则用else。例如,(<)?foo(?(1)|(bar))匹配foo和foobar。
贪婪计量器:*,+,?,{num, num}
用贪婪计量器来检测一个结构可以应用多少次。尝试进行所有的匹配,但是如果已经成功匹配则可以回溯或放弃匹配。例如,(ab)+匹配所有的ababababab。
惰性计量器(Lazy quantifiers):*?,+?,??,{num, num}?
惰性计量器控制一个结构可能应用的次数。但是不像贪婪计量器,它试图进行尽可能少的匹配次数。例如,(an)+?仅匹配一次banana。
所有的计量器(Possessive quantifiers):*+,++,?+,{num, num}+
所有的计量器像贪婪计量器,但是锁上(“lock in”)她的匹配,不允许后面分解子匹配的回溯。例如,(ab)++ab不匹配ababababab。
Unicode支持
Unicode字符集给世界上所有语言的每一个字符分配唯一的数字。因为可能字符的数量实在太大了,所以Unicode要求用不止一个字节来表示一个字符。有些正则表达式的实现不支持Unicode字符,因为它们希望1个字节的ASCII字符。Unicode字符的基础支持,从逐字匹配一个Unicode字符串开始。高级支持包括字符集和具体化所有支持Unicode语言的其他的结构。例如,/W既可能匹配è,也可能匹配e。