使用贪婪和不情愿的模式匹配器
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
为什么yxx
、yxx
的结果即使是最小的可能值也不可能?
【问题讨论】:
【参考方案1】:正则表达式引擎返回它找到的第一个和最左边的匹配项。
基本上它会尝试从第一个字符开始匹配模式。如果没有找到对应的匹配,则传输跳入并从第二个字符开始重试,以此类推。
如果您在bab
上使用a+?b
,它将首先从第一个b
尝试。这不起作用,所以我们从第二个字符开始尝试。
但在这里它从第一个字符开始找到匹配项。从第二个开始甚至不考虑,我们找到了一个匹配所以我们返回。
如果您在aab
上应用a+?b
,我们会尝试第一个a
并找到一个整体匹配:故事结束,没有理由尝试其他任何事情。
总结:正则表达式引擎是从左到右的,所以懒惰只能影响右边的长度。
【讨论】:
以上是关于使用贪婪和不情愿的模式匹配器的主要内容,如果未能解决你的问题,请参考以下文章