占有量词如何运作?

Ari*_*iel 2 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.
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ker 6

接下来的+量词意味着"不允许正则表达式引擎回溯到先前令牌匹配的任何内容".(请参阅此处的占有量词教程).

所以当你申请.*foo"xfooxxxxxxfoo",第.*一个匹配整个字符串.然后,由于foo无法匹配,正则表达式引擎会回溯到可能的情况,在.*匹配"xfooxxxxxx"并匹配时实现foo匹配"foo".

现在附加功能+可以防止发生回溯,因此匹配失败.

当你写作(.*)+foo.所述+发生在一个完全不同的含义; 现在它意味着"前面一个或多个令牌".顺便提一下,你已经创建了嵌套量词,这不是一个好主意.如果你将这个正则表达式应用于类似的字符串"xfoxxxxxxxxxfox",你将遇到灾难性的回溯.