正则表达式和模式匹配简介(三)

正则表达式和模式匹配简介——注释和模式变换

作者:张桂权

(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)

       模式变化改变正则表达式引擎解释正则表达式的方式。(请参看MRE 110-113135-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匹配foobar

 

条件:(?ifthen |else

       If依赖于具体的实现,不过通常是捕获子表达式或环顾(lookaround)的引用。而thenelse都是正则表达式模式。当if条件为真时,引用then,否则用else。例如,(<?foo?(1)|(bar))匹配foofoobar

 

贪婪计量器:*+?{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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值