零宽断言
零宽断言在不同的平台又叫做环视、预搜索等。
它的名字也代表了它的意思:
<1> 它相当于一个附加条件。现在把原来的正则式叫做主式子,零宽断言的式子叫做断言式。在搜索正则式的时候不但要满足搜索到的部分满足主式子的条件,并且它的前面或者后面(就是环视、断言、预搜索)也要断言式条件。
<2> 但是这个断言式不占用正则式的宽度(零宽)。什么意思呢,就是断言式的作用,除了会判断前后是否匹配外,不产生任何其它的影响。也就是返回的结果、下次匹配的位置等,这个附加条件不产生任何影响,就像只有原来那个主式子一样。
使用方法:
有四种,匹配左边,右边,肯定,否定,组合起来就4中
表达式
(?=Expression)
顺序肯定,表示匹配部分的右侧必须匹配Expression
(?!Expression)
顺序否定,表示匹配部分的右侧不能匹配Expression
(?<=Expression)
逆序肯定,表示匹配部分的左侧必须匹配Expression
(?<!Expression)
逆序否定,表示匹配部分的左侧不能匹配Expression
例子:
"^(?=<)<[^>]+>\w+"
用它匹配"<dev>antzone"
首先由正则表达式中的”^”获取控制权,首先由位置0开始进行匹配,它匹配开始位置0,匹配成功,然后控制权转交给”(?=<)”,由于”^”是零宽的(匹配了之后就想它根本不存在一样),所以”(?=<)”也是从位置0处开始匹配,它要求所在的位置右侧必须是字符”<”,位置0的右侧恰好是字符”<”,匹配成功,然后控制权转交个”<”,由于”(?=<)”也是零宽的,所以它也是从位置0处开始匹配,于是匹配成功,后面的匹配过程就不介绍了。
引用
首先有捕获组的概念,也就是正则式匹配中的组。
然后可以使用组编号来引用前面匹配到的内容,然后进行匹配。这就是反向引用。
使用方法,用 \数字
的方式,表示引用哪一组。比如([ab])\1,匹配aabbcc的结果是aa和bb
如果正则式很复杂,编号就会难以计算,所以可以对组进行命名,Java 7 提供了这个功能。
语法是(?<自定义名>expr)
比如(?<year>\d{4})-\k<year>
可以匹配1999-1999
普通捕获组和命名捕获组的混合编号:
这种情况下的编号是按先编入没命名的组,在编入命好名字的组。