[英]How exactly does the possessive quantifier work?
在页面末尾,尝试解释贪婪,勉强和所有格修饰符的工作方式: 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。 找不到匹配项,第二个匹配吗? 这2个reg.exp。之间的确切区别是什么?
另一个量词后面的+
表示“不允许正则表达式引擎回溯到先前标记已匹配的任何内容”。 (请参阅此处的所有格量词教程)。
因此,当您将.*foo
应用于"xfooxxxxxxfoo"
, .*
首先会匹配整个字符串。 然后,由于无法匹配foo
,因此正则表达式引擎将回溯到可能的情况,当.*
匹配"xfooxxxxxx"
且foo
匹配"foo"
时实现匹配。
现在,附加的+
可以防止发生回溯,因此匹配失败。
当您写(.*)+foo
。 +
含义完全不同; 现在它的意思是“前面的一个或多个令牌”。 顺便说一下,您已经创建了嵌套量词。 如果将该正则表达式应用于"xfoxxxxxxxxxfox"
类的字符串,则会遇到灾难性的回溯 。
所有格量词会采用整个字符串,并检查它是否匹配,否则匹配失败。 在您的情况下,xfooxxxxxxfoo与.*+
匹配,但是您要求另一个 foo
(不存在),因此匹配器失败。
贪婪的量词首先执行相同的操作,但没有失败,而是“退后”并再次尝试:
xfooxxxxxxfoo fail
xfooxxxxxxfo fail
xfooxxxxxxf fail
xfooxxxxxx match
在第二个正则表达式中,您需要通过混淆分组机制来提出其他要求。 您要求“一个或多个(。*)匹配项”,因为+现在与()有关,并且存在一个匹配项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.