微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则式进阶基于Java

零宽断言
零宽断言在不同的平台又叫做环视、预搜索等。
它的名字也代表了它的意思:
<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中都没有提供支持了。

原文地址:https://www.jb51.cc/regex/357626.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐