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

时间:2014-04-18 09:57:00

标签: java regex

在java regex中,我读过Greedy and Reluctant Quantifiers。他们提到了

  

不情愿或非贪婪的"量词首先匹配少   可能。所以。*首先匹配任何东西,留下整个   字符串不匹配

在这个例子中

  

来源:yyxxxyxx
  模式:.*xx

贪婪量词*并生成

0 yyxxxyxx

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

0 yyxx
4 xyxx

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您在a+?b上使用bab,则会先从第一个b开始尝试。这不起作用,所以我们尝试从第二个角色。

但是在这里它从第一个角色找到了一个匹配。从第二个开始甚至没有考虑,我们找到了一个匹配,所以我们返回。

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

总结:正则表达式引擎从左向右移动,因此懒惰只会影响右侧长度。