正则表达式懒惰匹配
来源:互联网 发布:手机节拍器软件 编辑:程序博客网 时间:2024/05/17 04:07
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
忽略优先量词
量词"*?"、"+?"、"??"、"{n,m}?"、"{n,}?"都属于忽略优先量词,忽略优先量词使用的是在?、+、*、{}后面添加?组成的,忽略优先在匹配的时候首先会尝试忽略,如果失败后回溯才会选择尝试。比如`ab??`匹配“abb”会得到‘a’而不是“ab”。当引擎匹配成功a后,由于是忽略优先,引擎首先选择不匹配b,继续查看表达式,发现表达式结束了,那么引擎就直接上报匹配成功。具体我们通过下面的例子一步一步说明忽略优先量词工作原理。
例子
还是上面的例子,用"/_\w*?_/"匹配"_abc_123_" 中 第一对"_"之间的字符。
开始匹配第一个'_'之后,‘\w*?’首先决定不需要匹配任何字符,因为它是忽略优先量词,这时候就拿表达式'/_\w*?_/'中的第二个'_'('\w*?'后面的'_')和目标串'_abc_123_'中的'a'匹配,匹配失败,这时候才会拿'\w*?'去尝试未匹配的分支(使用\w匹配a,尝试匹配a成功)
下一步,是尝试匹配,还是忽略呢?因为'\w*?'是忽略优先量词,会选择忽略,那么就是重复上一步,'_'匹配b失败,'\w*?'去尝试未匹配的分支ab,以上步骤总共重复了3次后(直到表达式'\w*?'后面的'_'和目标串第二个'_'匹配),最终匹配出'abc'。
过程(开始匹配第一个'_'之后):
- 表达式/_\w*?_/'中的第二个'_'和目标串'_abc_123_'中的'a'匹配,匹配失败,'\w*?'尝试匹配目标串'_abc_123_'中的'a',匹配成功。
- 表达式/_\w*?_/'中的第二个'_'和目标串'_abc_123_'中的'b'匹配,匹配失败,'\w*?'尝试匹配目标串'_abc_123_'中的'ab',匹配成功。
- 表达式/_\w*?_/'中的第二个'_'和目标串'_abc_123_'中的'c'匹配,匹配失败,'\w*?'尝试匹配目标串'_abc_123_'中的'abc',匹配成功。
- 表达式/_\w*?_/'中的第二个'_'和目标串'_abc_123_'中的'_'匹配,匹配成功,匹配结束。结果为abc。
- 正则表达式懒惰匹配
- 正则表达式懒惰匹配,和贪婪匹配
- 正则表达式 懒惰匹配与贪婪匹配
- Java 正则表达式中的懒惰匹配
- (PHP)正则表达式-贪婪匹配与懒惰匹配的区别
- 正则表达式的贪婪匹配与懒惰匹配
- 正则表达式的【贪婪匹配】和【懒惰匹配】
- 正则表达式中的贪婪匹配和懒惰匹配
- 正则表达式的贪婪匹配与懒惰匹配
- 正则表达式的贪婪匹配与懒惰匹配
- PHP正则表达式-贪婪与懒惰匹配
- PHP正则表达式-贪婪与懒惰匹配
- 正则表达式学习笔记011--贪婪和懒惰的匹配
- 正则表达式的懒惰匹配和前瞻等
- javascript正则表达式之最长匹配(贪婪匹配)和最短匹配(懒惰匹配)
- 正则中的“贪婪匹配”和“懒惰匹配”
- 正则表达式--贪婪与懒惰
- 贪婪与懒惰--正则表达式
- Java:String和Date、Timestamp之间的转换
- POI设置单元格内容下拉框选择和单元格提示功能
- C/C++笔记--多态及虚表分析
- php项目,别人无法访问自己电脑上Apache服务器原因
- OKHttp
- 正则表达式懒惰匹配
- 获取一个字符串在另一字符串中出现的次数
- linux ulimit命令用法解析
- Spark性能优化指南——基础篇
- android listview滑动删除,实现item的点击缩回
- 操作系统_第一章_操作系统的功能
- 网页自动生成二维码
- xUtils简介
- ubuntu_wordpress搭建博客