所有格量词究竟是如何工作的



在页面的末尾,试图解释贪婪,不情愿和占有欲量词是如何工作的: 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. 找不到匹配项,而第二个则找到匹配项?这两个正则表达式之间的确切区别是什么?

另一个量词之后的+意味着"不允许正则表达式引擎回溯到以前的令牌匹配的任何内容"。(请参阅此处所有格量词的教程(。

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

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

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

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

贪婪量词首先执行相同的操作,但它没有失败,而是"退缩"并再次尝试:

xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match

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

相关内容

  • 没有找到相关文章

最新更新