占有量词如何运作?

时间:2013-12-06 13:35:27

标签: java regex greedy quantifiers

在页面的最后,有人试图解释贪婪,不情愿和占有欲量词如何运作:http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

然而,我尝试了一个例子,我似乎并没有完全理解它。

我会直接粘贴我的结果:

Enter your regex: .*+foo
Enter input string to search: xfooxxxxxxfoo
No match found.

Enter your regex: (.*)+foo
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

为什么第一个reg.exp。找不到匹配,第二个呢? 这两个reg.exp之间的确切区别是什么?

2 个答案:

答案 0 :(得分:6)

另一个量词之后的+意味着“不允许正则表达式引擎回溯到先前令牌匹配的任何内容”。 (请参阅此处的possessive quantifiers教程)。

因此,当您将.*foo应用于"xfooxxxxxxfoo"时,.*首先匹配整个字符串。然后,由于foo无法匹配,因此正则表达式引擎会回溯,直到.*匹配"xfooxxxxxx"foo匹配"foo"时匹配为止}。

现在额外的+可以防止发生回溯,因此匹配失败。

当你写(.*)+foo时。 +具有完全不同的含义;现在它意味着“前面一个或多个令牌”。顺便提一下,你已经创建了嵌套量词,这不是一个好主意。如果您将该正则表达式应用于"xfoxxxxxxxxxfox"之类的字符串,则会遇到catastrophic backtracking

答案 1 :(得分:0)

占有量词采用整个字符串并检查它是否匹配,如果不匹配则失败。在你的情况下,xfooxxxxxxfoo与.*+匹配,但是你要求另一个 foo,这不存在,所以匹配器失败。

贪婪的量词首先做同样的事情,但不是失败而是“退缩”并再次尝试:

xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match

在你的第二个正则表达式中,你通过混淆分组机制来要求其他东西。你要求“(。*)”的一个或多个匹配,因为+现在与()有关,并且有一个匹配。