【摘抄】正则表达式的非贪婪匹配
2010-05-31 16:30
357 查看
· 用懒惰性取代贪婪性
一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。
再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个记号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。整个过程大致如此。
· 惰性扩展的一个替代方案
我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。
这里是 原文链接
一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。
再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个记号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。整个过程大致如此。
· 惰性扩展的一个替代方案
我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。
这里是 原文链接
相关文章推荐
- VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线:
- js正则表达式的贪婪匹配和非贪婪匹配
- 正则表达式的贪婪匹配(.*)和非贪婪匹配(.*?)
- python正则表达式之贪婪引发的匹配无法退出,CPU 100%
- python非贪婪、多行匹配正则表达式
- 正则表达式的贪婪匹配问题
- 正则表达式(vim版)非贪婪匹配释疑
- Python正则表达式非贪婪、多行匹配功能示例
- (学习)python非贪婪、多行匹配正则表达式例子
- python 正则表达式的贪婪匹配与非贪婪匹配
- 正则表达式的贪婪匹配和非贪婪匹配
- Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配
- 正则表达式-贪婪与非贪婪匹配
- VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :
- 正则表达式-贪婪与非贪婪匹配
- 正则表达式的括号与贪婪匹配
- 正则表达式中贪婪和非贪婪(惰性)匹配的区别与效率问题
- python非贪婪、多行匹配正则表达式例子
- 正则表达式 贪婪匹配 转义
- 正则表达式的贪婪匹配与懒惰匹配