零宽断言 零宽断言在不同的平台又叫做环视、预搜索等。 它的名字也代表了它的意思: <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
普通捕获组和命名捕获组的混合编号: 这种情况下的编号是按先编入没命名的组,在编入命好名字的组。
还有平衡组与递归匹配,在正则式中添加注释(正则式太长的时候)。这些不是很常用,在Java中都没有提供支持了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|