所有格量词如何工作?

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


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

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

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

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


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

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

xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match

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

链接地址: http://www.djcxy.com/p/13419.html

上一篇: How exactly does the possessive quantifier work?

下一篇: How to precisely identify & work greedy or reluctant quantifiers?