2

在页面的末尾,试图解释贪婪、不情愿和占有量词是如何工作的: 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. 之间的确切区别是什么?

4

2 回答 2

6

after another 量词的+意思是“不允许正则表达式引擎回溯到前一个标记匹配的任何内容”。(请参阅此处的所有格量词教程)。

所以当你申请.*foo"xfooxxxxxxfoo",第.*一个匹配整个字符串。然后,由于foocan't be match ,正则表达式引擎回溯直到有可能,在 has match 和 has match.*"xfooxxxxxx"实现foo匹配"foo"

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

当你写(.*)+foo. 具有+完全不同的含义;现在它的意思是“一个或多个前面的标记”。顺便说一句,您已经创建了嵌套量词,这不是一个好主意。如果您将该正则表达式应用于类似 的字符串"xfoxxxxxxxxxfox",您将遇到灾难性的回溯

于 2013-12-06T13:41:39.940 回答
0

所有格量词获取整个字符串并检查它是否匹配,如果不匹配则失败。在您的情况下, xfooxxxxxxfoo 匹配,.*+但随后您要求另一个 foo不存在的 ,因此匹配器失败。

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

xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match

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

于 2013-12-06T13:40:31.273 回答