Java 所有格量词到底是如何工作的?

Java 所有格量词到底是如何工作的?,java,regex,greedy,quantifiers,Java,Regex,Greedy,Quantifiers,在这一页的末尾,我们试图解释贪婪、勉强和占有量词是如何工作的: 然而,我尝试了自己的一个例子,我似乎并不完全理解它 我将直接粘贴我的结果: 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 "xfoox

在这一页的末尾,我们试图解释贪婪、勉强和占有量词是如何工作的:

然而,我尝试了自己的一个例子,我似乎并不完全理解它

我将直接粘贴我的结果:

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.之间的确切区别是什么?

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

贪婪的量词首先也会这样做,但不会失败,而是“后退”并重试:

xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match

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

另一个量词后面的
+
表示“不允许正则表达式引擎回溯到先前标记匹配的内容”。(请参见此处的教程)

因此,当您将
*foo
应用于
“xfooxxxxxxfoo”
时,
*
首先匹配整个字符串。然后,由于无法匹配
foo
,因此正则表达式引擎会回溯到这一点,当
*
匹配了
“xfooxxxxxx”
并且
foo
匹配了
“foo”
时实现匹配

现在,附加的
+
阻止了回溯,因此匹配失败


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

您的答案给了我比我要求的更多的东西。我想这就解释了关于量词的所有知识。@Ariel:谢谢,但是量词比这多得多:)比如什么?关于量词,我还应该知道什么?@Ariel:例如,懒惰匹配和贪婪匹配之间的区别非常相关。然后,有
*
+
{n,m}
可供选择,每一个都可以设置为占有或懒惰。看见