正则之贪婪和非贪婪(惰性)模式
前言
阅读此文章之前建议先了解常用正则特殊字符
- 贪婪模式的量词,也叫
匹配优先
量词,包括:
“?”、“*”、“+”、“{n,}”、“{n,m}” - 非贪婪模式的量词,也叫
忽略优先
量词(匹配优先量词后加“?”),包括:
“??”、“*?”、“+?”、“{n,}?”、“{n,m}?”
概述
贪婪模式和非贪婪模式影响的是被量词修饰的子表达式的行为,贪婪模式是在整个表达式匹配成功的前提下尽可能多的匹配,非贪婪模式则是在整个表达式匹配成功的前提下尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
参照以下例子来简单认识下贪婪和非贪婪模式下不同的匹配结果:
示例字符串:“<div><img src=”http://guoweitang.net/1.jpg”><img src=”http://guoweitang.net/2.jpg”></div>”
- 贪婪模式:
/\bsrc=".+"/
匹配结果:src="http://guoweitang.net/1.jpg"><img src="http://guoweitang.net/2.jpg"
- 非贪婪模式:
/\bsrc=".+?"/
匹配结果:src="http://guoweitang.net/1.jpg"
匹配原理
NFA匹配原理参考正则基础之——NFA引擎匹配原理
贪婪模式
源字符串:”Regex”
正则表达式:”.*”
下面我们看一下匹配过程:
- 首先由第一个“””取得控制权,匹配位置0位的“””,匹配成功,控制权交给“.*”。
- “.*”取得控制权后,由于“*”是
匹配优先
量词,在可匹配可不匹配的情况下,优先尝试匹配。从位置1处的“R”开始尝试匹配,匹配成功,继续向右匹配,直到匹配到结尾的“””,匹配成功,由于此时已匹配到字符串的结尾,所以“.*”结束匹配,将控制权交给正则表达式最后的“””。 - “””取得控制权后,由于已经在字符串结束位置,匹配失败,向前查找可供回溯的状态,控制权交给“.*”,由“.*”让出一个字符,也就是字符串结尾处的“””,再把控制权交给正则表达式最后的“””,由“””匹配字符串结尾处的“””,匹配成功。
此时整个正则表达式匹配成功,其中“.*”匹配的内容为“Regex”,匹配过程中进行了一次
回溯。
非贪婪模式
源字符串:”Regex”
正则表达式:”.*?”
下面我们看一下匹配过程:
- 首先由第一个“””取得控制权,匹配位置0位的“””,匹配成功,控制权交给“.*?”。
- “.*?”取得控制权后,由于“*?”是
忽略优先
量词,在可匹配可不匹配的情况下,优先尝试不匹配。从位置1处尝试忽略匹配,也就是不匹配任何内容,将控制权交给正则表达式最后的“””。 - “””取得控制权后,从位置1处尝试匹配,由“””匹配位置1处的“R”,匹配失败,向前查找可供回溯的状态,控制权交给“.*?”,由“.*?”匹配一个字符,匹配位置1处的“R”,再把控制权交给正则表达式最后的“””。
- “””取得控制权后,从位置2处尝试匹配,由“””匹配位置1处的“e”,匹配失败,向前查找可供回溯的状态,重复以上过程,直到由“.*?”匹配到“x”为止,再把控制权交给正则表达式最后的“””。
- “””取得控制权后,从位置6处尝试匹配,由“””匹配字符串最后的“””,匹配成功。
此时整个正则表达式匹配成功,其中“.*?”匹配的内容为“Regex”,匹配过程中进行了五次
回溯。
匹配效率
从以上匹配过程看来,贪婪模式比非贪婪模式进行了更少的回溯,也就是更有效率,那是否贪婪模式逗比非贪婪模式效率更高呢,答案是否定的,如果贪婪模式匹配到了过多匹配结果不需要的内容时会进行更多的回溯,所以它们之间的效率没有绝对,要根据实际情况进行选择。
还有一个事实就是,非贪婪模式可以实现的,通过优化量词修饰的子表达式的贪婪模式都可以实现;而贪婪模式可以实现的,非贪婪模式不一定能实现。
贪婪模式效率提升
可以通过固化分组
或占有优先量词
来提升贪婪模式的匹配效率,非贪婪模式没有这一功能。
.NET中可以使用固化分组,Java中可以使用占有优先量词。
精通正则表达式七:占有优先量词和固化分组
正则之贪婪和非贪婪(惰性)模式相关推荐
- java 正则 惰性匹配_正则表达式 - 贪婪与非贪婪(惰性)
使用场景 有时,我们想用正则匹配以某个子串开头,且以某个子串或字符结尾的子字符串,但是结尾的字串或字符在原字符串中出现了多次,但我们只想匹配从开始处到第一次出现的地方,换句话说,想得到开始和结尾之间内 ...
- JAVA -- 正则之 贪婪与非贪婪模式概述(1)
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支 ...
- 正则之贪婪与非贪婪模式
1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模 ...
- 正则基础之——贪婪与非贪婪模式
正则基础之--贪婪与非贪婪模式 转自:正则基础之--贪婪与非贪婪模式 1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模 ...
- 正则表达式口诀及常用正则 。正则贪婪与非贪婪模式
正则表达式口诀及常用正则 签于网上太多的介绍都是一篇凶悍的短文,边看边理解可以,帮助记忆不行.又受五笔字型字根表口诀"白手看头三二斤..."的启发, 试作"正则表达式助 ...
- 正则表达式之 贪婪与非贪婪模式详解
1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...
- 转:正则表达式之 贪婪与非贪婪模式详解
1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...
- python基础(十二):正则、re模块、贪婪和非贪婪
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 元字符:在 ...
- PHP正则匹配效率,PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)
先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的.$str ...
最新文章
- oracle 删掉虚拟目录,创建虚拟目录失败,必须为服务器名称指定“localhost”
- linux 内核 netfilter 网络过滤模块 (1)-框架
- python读法1002python读法-Python教程之绘制Mandelbrot集合
- 关于数据库内“表”的几点
- Java Base64 编码解码方案总结
- Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
- Spring Data JPA 从入门到精通~@NamedQueries预定义查询
- 优化if-else代码的八种方案!
- phpstudy设置允许远程访问mysql数据库
- [MySql] - 数据库备份还原
- 如何实现卫星通信的稳定链接?
- java项目-第37期基于springboot+layui实现的医院His系统【毕业设计】
- 数据挖掘案例实战:利用LDA主题模型提取京东评论数据(四)
- 16比9尺寸是多少厘米_16比9尺寸的长宽是多少像素
- 关于2022虎符pwn mva解决jmp rax无法反汇编的这么个事情
- JAVA实现从服务器下载文件,将下载文件转成文件流响应给前端
- 计算机复试面试题目大全文库,自动化考研面试题库
- 机器人鸣人是哪一集_火影忍者596集剧情介绍番外篇九尾抢夺指令_鸣人VS机器人版鸣人...
- 2017阿里实习生在线编程题
- 【kernel exploit】CVE-2022-2588 Double-free 漏洞 DirtyCred 利用
热门文章
- python 代码跳动之美
- 126邮箱登录---iframe
- Java线程中的sleep方法详解
- 教育基础知识与基本能力(知识点)
- 第一篇:mysqlcluster数据库集群的搭建和配置
- C9555E: Failed to check out a license.----关于arm DS 5出现的小问题
- FileBeat系列:multiline的pattern negate match使用方法
- 苹果6出现3g信号或者无服务器,3G iPhone信号接收有问题 或是芯片组故障
- 一杯“柠檬茶”搅动茶饮江湖,“低卡健康”击中年轻人需求?
- easyui源码翻译1.32--Resizable(调整大小)