所有格量词如何工作?
在页面末尾,试图解释贪婪,不情愿和占有量词如何工作: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?