得不匹配\"xxx\"才可以让后边的\"d\"匹配,从而使整个表达式匹配成功。因此,结果是:\"\\w+?\"匹配\"xxx\"
Group, Back Reference(分组、反向引用)
正则表达式引擎不仅记录最终的匹配结果,使用()括起来的子表达式匹配到的文本串,在匹配过程中也会记录下来。在.Net中,可以使用Match.Groups访问某个匹配结果的所有分组。
没有指定名称的分组称为匿名分组,对所有的匿名分组都默认有一个组号。.Net中组号为0的分组是整个正则表达式,而不管这个正则表达式是否使用()括起来了。对于其它的匿名分组,根据左括号出现的先后位置依次从1开始编号。例如表达式((abc)\\d+)?(xyz)(.*)总共有5个分组,依次为0:((abc)\\d+)?(xyz)(.*), 1:((abc)\\d+), 2:(abc), 3:(xyz), 4:(.*)。
可以对分组命名,.Net中命名方法:(?<groupName>patterns)。如果存在命名分组,则所有命名分组的编号将从最后一个匿名分组的位置开始,依次递增。例如表达式((?<group1>abc)\\d+)?(?<group2>xyz)(.*)的5个分组依次为0:((?<group1>abc)\\d+)?(?<group2>xyz)(.*), 1:((?<group1>abc)\\d+), 2:(.*), 3:(?<group1>abc), 4:(?<group2>xyz)。
在表达式的后面部分引用前面的某一个子表达式分组叫做反向引用。
对于匿名分组的反向引用方法是\"\\\" 加上分组编号,对于命名分组,.Net中的引用方法是\\k<groupName>。
Regular Expression Input String Result
(’|\")(.*?)(\\1) ’hello’ \"world\" 1. ’hello’
2. \"world\"
(\\w)\\1{4,} aa bbbb abcdefg ccccc 111121111 999999999 1. ccccc
2. 99999999
<(?<tag1>\\w+)>[\\w\\W]*</\\k<tag1>> <strong>Hello Kitty</strong> is the name <strong>Hello Kitty</strong> [Page]
注意上面表格中第二个例子的表达式与\\w{5,}的区别,(\\w)\\1{4,}表示同一个字符重复至少5次以上,而\\w{5,}表示连续5个以上字符(不必是同一个字符)。
可以禁止正则表达式记录某个分组的匹配结果,这样的分组也就不会被编号,无法被反向引用。禁止分组使用(?:patterns),例如表达式abc(?:\\w{3})(\\d+)abc总共有两个分组,组号0为整个表达式,组号1为(\\d+)。
.Net中,\\1到\\9总是被当作反向引用;\\12这种类型,如果存在编号为12的分组,则作为反向引用,否则将\\12转义为ASCII字符,为了消除这种歧意,可以使用\\k<n>这种方式。
注意:.Net中分组命名时尖括号<, >可以使用单引号代替。
Lookahead, Lookbehind(正向预搜索、反向预
搜索)
匹配当前的某一个子表达式时,可能需要根据前面或者后面出现的字符进行判断(即上下文环境),lookahead、lookbehind就是用于这个目的。
NFA以文本串作为有穷输入字符集Σ,从文本串逐个读取字符进行匹配,所以沿着字符读取方向的是lookahead,与字符读取方向相反则为lookbehind。
lookahead: (?=patterns), (?!patterns)。lookbehind: (?<=patterns), (?<!patterns)。
Regular Expression Input String Result
lookahead Windows (?=NT|XP)