`

正则表达式中的分组组合与反向引用符(转)

 
阅读更多

7.8 分组组合与反向引用符

分组组合符是将表达式中某部分内容组合起来的符号,反向引用符则是用于匹配分组组合捕获到的内容的标识符。

7.8.1 分组组合

(pattern)将pattern部分组合成一个可统一操作的组合项和子匹配,每个捕获的子匹配项按照出现的顺序存储在缓冲区中。缓冲区编号从1开始,最多可存储99个子匹配捕获的内容。存储在缓冲区中的子匹配捕获的内容,可以在编程语言中被检索,也可以在正则表达式中被反向引用。若要匹配字面意义的括号字符“(”和“)”,在正则表达式中要分别使用“\(”和“\)”。

7.8.2 反向引用

\num 匹配编号为num的缓冲区所保存的内容, num是标识特定缓冲区的一位或两位十进制正整数,这种方式称为子匹配的反向引用。反向引用能提供表示相同匹配项的能力。

例如,要匹配连续的3个数字字符,可以使用\d{3}作为正则表达式文本,可以匹配12345,但是要匹配连续的3个相同的数字字符,如3333、22222等,需要使用(\d)\1{2}作为正则表达式文本,\1表示与前面的(\d)所捕获的内容一致,\1{2}则表示前面的(\d)所捕获的内容还连续出现2次。

再如,要匹配“Is is the cost of of gasoline going up up?”中所有连续重复的单词部分,可使用/\b([a-z]+)\1\b/gi作为正则表达式文本,其中的[a-z]表示匹配a~z之间的任何一个字符,\b用于匹配单词的边界。

7.8.3 非捕获匹配

(?:pattern) 将pattern部分组合成一个可统一操作的组合项,但不把这部分内容当作子匹配捕获,即pattern部分是一个非捕获匹配,匹配的内容不存储在缓冲区中供以后使用。这对必须进行组合、但又不想让组合的部分具有子匹配特点的情况很有用。

例如,要将“xyz?”中的“xyz”组合起来,但并不想将匹配的内容保存在缓冲区中,应该使用“(?:xyz)?”,而不能使用“(abc)?”。又如,不能将“industry|industries”简单改写为“industry(ylies)”,若不需要引用或检索括号中的表达式所匹配的结果,最好还是写成“industry(?:ylies)”。

7.8.4 正向“预测先行”匹配

(?=pattern) 称为正向“预测先行”匹配,在被搜索字符串的相应位置,必须有pattern部分匹配的内容,但不作为匹配结果处理,更不会存储在捕获缓冲区中供以后使用。例如,“Windows (?=XP|2000)”只与“Windows 2000”或“Windows XP”中的“Windows”匹配,而不与“Windows 2003”中的“Windows”匹配。

注意

该模式下匹配的结果只是“Windows”部分,而使用“Windows (?:NT|2000)”匹配的是整个“Windows 2000”或“Windows NT”。如果要将 “NT”和“2000”前面的“Windows”替换成“Win”,需要使用“Windows (?=NT|2000)”,而不能使用“Windows (?:NT|2000)”,否则,整个“Windows 2000”或“Windows NT”将被替换成“Win”。

7.8.5 反向“预测先行”匹配

(?!pattern)称为反向“预测先行”匹配,在被搜索字符串的相应位置不能有pattern部分匹配的内容,此外,其功能与正向“预测先行”匹配一样。例如, “Windows (?!XP|2000)”不与“Windows 2000”或“Windows XP”中的“Windows”匹配,而可以与“Windows 2003”中的“Windows”匹配。

 

http://book.51cto.com/art/200804/68964.htm

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics