2.8 后向引用

  当一个正则表达式被分组之后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右、以分组的左括号“(”为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。

  反向引用提供查找重复字符组的方便的方法。它们可被认为是再次匹配同一个字符串的快捷指令。后向引用可以使用数字命名(即默认名称)的组号,也可以使用指定命名的组号。它们的具体说明如表2-8所示。

表2-8 后向引用

表达式

说明

/数字

使用数字命名的后向引用。

/k<name>

使用指定命名的后向引用。

注意:在表2-8中,表达式/k<name>.NET Framework所支持。

  以下正则表达式匹配具有两个重复字符的单词。

/b(/w)/1/b                                                                    (65)

注意:正则表达式/b(/w)/1/b/b(/w)/w/b并不等效,第一个表达式只匹配两个相同字符的单词,而第二个表达式匹配具有两个字符(可以相同,也可以不相同)的单词。

  以下正则表达式首先匹配单词的开头处,然后匹配一个字符和数字,再重复该字符和数字,最后是单词的结尾处。

/b(/w)(/d)/1/2/b                                                                 (66)

  使用工具Regex Tester分别测试了正则表达式(65)和/b(/w)/w/b,结果如图所示。在测试结果中,正则表达式/b(/w)/1/b只匹配了单词“aa”,而正则表达式/b(/w)/w/b可以匹配单词“aa”和“ab”。

 

 

 

 

      以下正则表达式匹配以两个重复字符结尾的单词。

/b/w*(/w+)/1/b                                                                 (67)

  以下正则表达式匹配重复出现的单词。

/b(/w+)/b/s+/1/b                                                                (68)

  上述正则表达式/b(/w+)/b/s+/1/b匹配的具体过程如下:

1)表达式/b(/w+)/b匹配一个单词,且单词的长度至少为1

2)表达式/s+匹配一个或多个空白字符;

3)表达式/1将重复子表达(/w+)匹配的内容,即重复匹配的单词;

4)匹配单词的结束位置。

  分组不但可以使用数字作为组号,而且还可以使用自定义名称作为组号。以下两个正则表达式都是将分组后的子表达式/w+命名为“word”。

(?<word>/w+)                                                              (69)

(?'word'/w+)                                                                    (70)

  因此,正则表达式/b(/w+)/b/s+/1/b和以下正则表达式等价,它们都匹配重复出现的单词。

/b(?<word>/w+)/b/s+/k<word>/b                                         (71)

  以下正则表达式和正则表达式/b/w*(/w+)/1/b等价,它也是匹配以两个重复字符结尾的单词。

/b/w*(?<char>/w+)/k<char>/b                                           (72)

  分组子表达式(?<name>)将元字符括在其中,并强制正则表达式引擎记住该子表达式匹配,同时使用“name”将该匹配进行命名。反向引用/k<name>使引擎对当前字符和以名称“name”存储的先前匹配字符进行比较,从而匹配具有重复字符的字符串。正则表达式中的常用分组说明如表2-9所示。

表2-9 常用分组说明

字符

说明

(experssion)

匹配字符串experssion,并将匹配的文本保存到自动命名的组里。

(?<name>experssion)

匹配字符串experssion,并将匹配的文本以name进行命名。该名称不能包含标点符号,不能以数字开头。

(?:experssion)

匹配字符串experssion,不保存匹配的文本,也不给此组分配组号。

(?=experssion)

匹配字符串experssion前面的位置。

(?!experssion)

匹配后面不是字符串experssion的位置。

(?<=experssion)

匹配字符串experssion后面的位置。

(?<!experssion)

匹配前面不是字符串experssion的位置。

(?>experssion)

只匹配字符串experssion一次。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值