正则表达式的贪婪匹配和非贪婪匹配
正则表达式默认是贪婪匹配,即每个规则都尽可能多的匹配
非贪婪匹配的每个规则具体匹配到哪里,可以总结为
- 尽可能少的匹配
- 匹配到下一个规则为止
来看例子
package RegularExpression;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class demo5 {public static void main(String[] args) {//正则表达式的贪婪匹配Pattern pattern = Pattern.compile("(\\d+)(1*)");Matcher matcher = pattern.matcher("1213111");if (matcher.matches()) {System.out.println("group1=" + matcher.group(1));System.out.println("group2=" + matcher.group(2));}}
}
这里是贪婪匹配,所以虽然我将正则表达式分为了两组,希望用(\d+)匹配1213,而(1*)匹配剩下的3个1
但是结果是
(\d+)这个规则实际上会将整个字符串的所有数字都匹配了,不会留给(1*)这个规则,所以group(2)里面什么都没有
这就是贪婪匹配,即尽可能多的匹配,只要字符串中的内容满足这个规则,就会全部匹配上
那么现在,在规则的后面加上一个?,这表示非贪婪匹配
package RegularExpression;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class demo5 {public static void main(String[] args) {//正则表达式的非贪婪匹配Pattern pattern = Pattern.compile("(\\d+?)(1*)");Matcher matcher = pattern.matcher("1213111");if (matcher.matches()) {System.out.println("group1=" + matcher.group(1));System.out.println("group2=" + matcher.group(2));}}
}
结果为
这里就可以发现,按照我们一开始希望的那样分组了
这里问题来了,\d是可以匹配0到9的数字字符的,那么为什么非贪婪匹配状态下的\d+就能这么准的匹配到1213截止,而后面的不匹配呢
这里就是非贪婪匹配的特点
尽可能少的匹配,以及匹配到下一个规则为止
这里后面的111都可以交给1*规则来匹配,不需要自己来匹配,所以\d+到此为止,如果我们修改一下代码
package RegularExpression;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class demo5 {public static void main(String[] args) {//正则表达式的非贪婪匹配Pattern pattern = Pattern.compile("(\\d+?)(0*)");Matcher matcher = pattern.matcher("1213111");if (matcher.matches()) {System.out.println("group1=" + matcher.group(1));System.out.println("group2=" + matcher.group(2));}}
}
(1*)被换成了(0*),结果是
如果后面的规则不能匹配剩下的字符串,那么非贪婪匹配的规则也依旧后往后匹配
这里再举一个例子
package RegularExpression;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class demo5 {public static void main(String[] args) {Pattern pattern = Pattern.compile("(\\d+?)(0*?)(0*)");Matcher matcher = pattern.matcher("1230000");if (matcher.matches()) {System.out.println("group1=" + matcher.group(1));System.out.println("group2=" + matcher.group(2));System.out.println("group3=" + matcher.group(3));}}
}
会发现(0*?)没有匹配任何字符,这是因为修饰符 * 可以匹配任意个字符,包括0个字符。非贪婪的规则,能不匹配就不匹配,而且后面也有能匹配剩余字符串的规则。所以这里group(2)里面的内容是空。
正则表达式的贪婪匹配和非贪婪匹配相关推荐
- 匹配正则_程序员入门基础:python正则表达式贪婪匹配和非贪婪匹配
此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式. 一.贪婪匹配和非贪婪匹配 举例说明概念: print('非贪婪匹配',re.search('el+ ...
- 正则表达式:贪婪匹配与非贪婪匹配
情景 之前写过一个简单的爬虫,每天获取公司insgtagram主页的粉丝数用来进行粉丝趋势的展示.代码很简单就是通过获取主页源代码后用正则表达式匹配其中的一串json数据,再用python的json解 ...
- 10、正则表达式 (笔试题、语法规则、正则对象方法、正则实例属性、支持正则表达式的String对象的方法、贪婪匹配与非贪婪匹配)
正则表达式 目录 10.1 语法规则 10.1.1 创建方法 1.直接量 2.构造方法RegExp() 10.1.2 三个属性i,g,m 10.1.3 方括号 10.1.4 元字符 10.1.5 量词 ...
- 正则表达式之贪婪匹配与非贪婪匹配
在前面正则表达式匹配规则里,提到了 .* . :匹配除 "\n" 之外的任何单个字符.要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式 * :匹配0个或多个 ...
- shell 分割字符串_谈一谈Shell中的贪婪匹配和非贪婪匹配
Shell中的贪婪匹配和非贪婪匹配 非贪婪匹配,即匹配符合通配符的最短结果. 贪婪匹配,即匹配符合通配符的最长结果. 下面案例为例: 1.${VALUE%.*}或${VALUE%%.*}: 删除VAL ...
- java 正则表达式 非贪婪模式_详解正则表达式的贪婪模式与非贪婪模式
什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配, ...
- python与正则表达式(part3)--贪婪模式和非贪婪模式
文章目录 贪婪模式和非贪婪模式 定义 贪婪模式转换为非贪婪模式 贪婪模式和非贪婪模式 定义 贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能多的匹配. 非贪婪模式(懒惰模式): 在整个表达式 ...
- Perl——正则表达式之贪婪模式和非贪婪模式
Perl--正则表达式之贪婪模式和非贪婪模式使用 使用perl进行正则表达式匹配时,常用两种匹配模式,一种是贪婪匹配,一种是非贪婪匹配. 贪婪匹配(greedy match):尽可能匹配最长的内容.默 ...
- 第11.9节 Python正则表达式的贪婪模式和非贪婪模式
在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...
- java 正则表达式 非贪婪模式_正则表达式的贪婪模式和非贪婪模式
一.什么是贪婪模式和非贪婪模式? 定义 贪婪模式:正则表达式趋向于匹配最大长度. 非贪婪模式:正则表达式趋向于匹配最小长度,即一旦匹配到结果就结束. 如何区分? 默认是贪婪模式. 若 量词 后面添加 ...
最新文章
- 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载
- 疫情之下,武汉女生在家中答辩,获得国外博士学位!
- 手机充电IC设置电流与实测电流不一致问题剖析
- 面试 技术 教训_我如何应用从失败的技术面试中学到的经验教训来获得5个工作机会
- 匿名函数 lambda
- xadmin 显示外键字段
- arduino 蓝牙示例_,arduino 蓝牙例子,
- 梯度提升树(GBDT)原理小结(转载)
- OpenStack之化云为雨
- python离线_python 离线一个网站
- 银行笔试题 java笔试题
- 每日一记:查看Oracle补丁更新情况
- 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)
- CKEditor5系列三:创建一个功能相对完善的插件
- 如何将邮箱里一封邮件添加到附件中进行发送
- mongodb如何记录慢查询
- fullcalendar的使用教程
- 您可以在哪里播放最喜欢的圣诞节特价商品
- 去除el-input四周白边
- 拉线位移编码器零线有电的原因
热门文章
- C语言发展史——程序猿抗争史
- 一个足球队员的不屈抗争·《晚唱·贾平凹》
- 使用POI读写word doc文件
- GSM与GPRS的区别
- SSM整合(Spring+SpringMVC+MyBatis)
- canvas的width和style.width的区别
- 2018-12支付宝红包赚钱薅羊毛全攻略
- 【NLP技术】:NLP简单介绍
- 如何用wamp运行php代码,请问如何将已经写好的PHP代码部署到WAMP环境中
- 【主动学习 03】Active Self-Paced Learning for Cost-Effective and Progressive Face Identification (PAMI‘18)