博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贪婪和非贪婪
阅读量:4320 次
发布时间:2019-06-06

本文共 1972 字,大约阅读时间需要 6 分钟。

  • 贪婪匹配:当正则表达式中包含能接受到重复的限定符时,通常的行为是匹配尽可能多的字符,这中匹配方式叫做贪婪匹配。特征是一次性读入整个字符串经行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃,直到匹配成功或者把整个字符串舍弃为止,因此它是一种最大化数据返回,能多不会少。

前面我们讲过重复限定符,其实这些限定符就是贪婪量词,比如表达式:\d{3,6}

用来匹配3到6位数字,在这种情况下,它是一种贪婪模式匹配,也就是假如字符串里有6个数字匹配,那它就会全部匹配到。

String test = "61762828 176 2991 871";    String reg = "\\d{3,6}";    Pattern pattern = Pattern.compile(reg);    Matcher mc = pattern.matcher(test);    while (mc.find()) {        System.out.println("匹配结果:" + mc.group());    }    // 匹配结果:617628    // 匹配结果:176    // 匹配结果:2991    // 匹配结果:871

由结果可见:本来字符串中的“61762828”这一段,其实只需要出现“617”就已经匹配成功了,但它并不满足,而是匹配到了最大能匹配的字符,也就是6个。

那么有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的呢?

是这样的,多个贪婪在一起时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰,但如果不能满足时,会根据深度优先的原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配。

String test = "61762828 176 2991 87321";    String reg = "(\\d{1,2})(\\d{3,4})";    Pattern pattern = Pattern.compile(reg);    Matcher mc = pattern.matcher(test);    while (mc.find()) {        System.out.println("匹配结果:" + mc.group());    }    // 匹配结果:617628    // 匹配结果:2991    // 匹配结果:87321

“617628” 是前面的\d{1,2}匹配出了61,后面的匹配出了7628

"2991" 是前面的\d{1,2}匹配出了29 ,后面的匹配出了91

"87321"是前面的\d{1,2}匹配出了87,后面的匹配出了321

  • 懒惰(非贪婪)

懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能少的字符,这种匹配方式叫做懒惰匹配。特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依次循环(读入字符,匹配)直到匹配成功或者把字符串的字符匹配完为止。

代码 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

 

 

 

 

 

 

String reg = "(\\d{1,2}?)(\\d{3,4})";    String test = "61762828 176 2991 87321";    System.out.println("文本:" + test);    System.out.println("贪婪模式:" + reg);    Pattern p1 = Pattern.compile(reg);    Matcher m1 = p1.matcher(test);    while (m1.find()) {        System.out.println("匹配结果:" + m1.group(0));    }    // 文本:61762828 176 2991 87321    // 贪婪模式:(\d{1,2}?)(\d{3,4})    // 匹配结果:61762    // 匹配结果:2991    // 匹配结果:87321

 

 “61762” 是左边的懒惰匹配出6,右边的贪婪匹配出1762

"2991"  是左边的懒惰匹配出2,右边的贪婪匹配出991
"87321" 左边的懒惰匹配出8,右边的贪婪匹配出7321

 

转载于:https://www.cnblogs.com/zhangj-ymm/p/9823379.html

你可能感兴趣的文章
如何从Eclipse官网下载我们想要的版本
查看>>
js获取spn里面的东西
查看>>
Mongodb之增删改查操作
查看>>
elasticsearch 索引,更新,增量更新,不停机修改升级 ,简单使用
查看>>
前端生成二维码图片以及条形码图片
查看>>
LA4794 分享巧克力
查看>>
《梦断代码》第四阶段阅读感想(包括第9、10、11共三章)
查看>>
OpenCV4Android 之 OpenCV4Android SDK
查看>>
serialVersionUID作用
查看>>
解决无法访问U盘打开提示拒绝访问的问题
查看>>
unicode 字符串。互相准换
查看>>
分组加密算法CBC模式的 Padding Oracle Attack 与 Hash算法的Length Extention Attack 小记...
查看>>
虚拟基类的初始化
查看>>
C++中析构函数为什么要是虚函数
查看>>
【转】记录pytty用户名和密码
查看>>
Django Rest Framework 视图和路由
查看>>
不忘初心,方得始终 ,让我们一起学习成长,感谢有你!
查看>>
InputControls的应用
查看>>
20190312_浅谈go&java差异(一)
查看>>
软件工程博客---团队项目---个人设计4(算法流程图)
查看>>