使用贪婪和不情愿的模式匹配器

Posted

技术标签:

【中文标题】使用贪婪和不情愿的模式匹配器【英文标题】:Pattern matcher using Greedy and Reluctant 【发布时间】:2014-04-18 09:56:59 【问题描述】:

在 java regex 中,我读过关于 Greedy and Reluctant Quantifiers 的信息。他们提到了

一个不情愿或“非贪婪”的量词首先匹配最少 可能的。所以 .* 一开始什么都不匹配,留下整个 字符串不匹配

在这个例子中

来源:yyxxxyxx 模式:.*xx

贪婪量词* 并产生

0 yyxxxyxx

不情愿的限定词*?,我们得到以下信息:

0 yyxx
4 xyxx

为什么yxxyxx的结果即使是最小的可能值也不可能?

【问题讨论】:

【参考方案1】:

正则表达式引擎返回它找到的第一个和最左边的匹配项。

基本上它会尝试从第一个字符开始匹配模式。如果没有找到对应的匹配,则传输跳入并从第二个字符开始重试,以此类推。

如果您在bab 上使用a+?b,它将首先从第一个b 尝试。这不起作用,所以我们从第二个字符开始尝试。

但在这里它从第一个字符开始找到匹配项。从第二个开始甚至不考虑,我们找到了一个匹配所以我们返回。

如果您在aab 上应用a+?b,我们会尝试第一个a 并找到一个整体匹配:故事结束,没有理由尝试其他任何事情。

总结:正则表达式引擎是从左到右的,所以懒惰只能影响右边的长度。

【讨论】:

以上是关于使用贪婪和不情愿的模式匹配器的主要内容,如果未能解决你的问题,请参考以下文章

贪婪模式与非贪婪模式

Python3中正则的贪婪匹配模式

第11.9节 Python正则表达式的贪婪模式和非贪婪模式

js正则匹配总结

正则表达式贪婪与非贪婪模式

浅谈正则表达式匹配模式—贪婪模式