Java正则之贪婪匹配、惰性匹配
作者:hebedich 时间:2022-08-14 16:41:23
贪婪量词:
先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么 再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。
惰性量词:
先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。
支配量词:
只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。
贪婪量词 惰性量词 支配量词 描述
-------------------------------------------------------------------------------------
? ?? ?+ 可以出现0次或1次,但至多出现1次
* *? *+ 可以出现任意次,也可以不出现
+ +? ++ 出现1次或多次,但至少出现1次
{n} {n}? {n}+ 一定出现n次
{n,m} {n,m}? {n,m}+ 至少出现n次,但至多不能超过m次
{n,} {n,}? {n,}+ 可以出现任意次,但至少出现n次
例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配
1、贪婪量词
var regexp = /.*bbb/g;
var a = str.match(regexp);
alert(a.length); //output:1
alert(a[0]); //output:abbbaabbbaaabbb
贪婪量词的工作过程可以这样表示:
a)abbbaabbbaaabbb1234
b)abbbaabbbaaabbb123
c)abbbaabbbaaabbb12
d)abbbaabbbaaabbb1
e)abbbaabbbaaabbb //true
可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词
var regexp = /.*?bbb/g;
var a = str.match(regexp);
alert(a.length); //output:3
alert(a[0]); //output:abbb
alert(a[1]); //output:aabbb
alert(a[2]); //output:aaabbb
惰性量词的工作过程可以这样表示:
a)a
b)ab
c)abb
d)abbb //保存结果,并从下一个位置重新开始
e)a
f)aa
g)aab
h)aabb
j)aabbb //保存结果,并从下一个位置重新开始
e)a
e)aa
e)aaa
e)aaab
e)aaabb
e)aaabbb //保存结果,并从下一个位置重新开始
由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:
String string = "abbbaabbbaaabbb1234";
Pattern p = Pattern.compile(".*+bbb");
Matcher m = p.matcher(string);
System.out.println(m.find()); //output:false
因为支配量词采用一刀切的匹配方式,如:
a)abbbaabbbaaabbb1234 //false
以上所述就是本文的全部内容了,希望大家能够喜欢,能够对大家熟练掌握java正则匹配有所帮助。
请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解Kotlin的空指针处理
![](https://img.aspxhome.com/file/2023/6/81956_0s.jpg)
解决JavaWeb读取本地json文件以及乱码的问题
解决idea删除模块后重新创建显示该模块已经被注册的问题
![](https://img.aspxhome.com/file/2023/8/84248_0s.jpg)
List集合对象中按照不同属性大小排序的实例
response文件流输出文件名中文不显示的解决
Mybatis利用OGNL表达式处理动态sql的方法教程
web打印 window.print()介绍
Java实现导出ZIP压缩包的方法
Spring Boot中如何使用断路器详解
![](https://img.aspxhome.com/file/2023/6/93066_0s.gif)
Android实现拍照、录像、录音代码范例
Winform实现将网页生成图片的方法
![](https://img.aspxhome.com/file/2023/8/76388_0s.jpg)
java中断线程的正确姿势完整示例
![](https://img.aspxhome.com/file/2023/8/67648_0s.jpg)
IntelliJ IDEA 2017 汉化包及图文教程
![](https://img.aspxhome.com/file/2023/0/59570_0s.jpg)
java面向对象设计原则之里氏替换原则示例详解
java自定义序列化的具体使用
![](https://img.aspxhome.com/file/2023/1/64951_0s.jpg)
Android studio实现简易计算器App功能
![](https://img.aspxhome.com/file/2023/0/98620_0s.jpg)
Java调用groovy脚本的方式分享
Android WebView无法弹出软键盘的原因及解决办法
mybatis-plus update更新操作的三种方式(小结)
![](https://img.aspxhome.com/file/2023/9/62639_0s.png)