【问题标题】:How exactly does the possessive quantifier work?所有格量词究竟是如何工作的?
【发布时间】:2013-12-23 21:13:54
【问题描述】:

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

【问题讨论】:

    标签: java regex greedy quantifiers


    【解决方案1】:

    另一个量词后面的+ 表示“不允许正则表达式引擎回溯到前一个标记匹配的任何内容”。 (在此处查看possessive quantifiers 的教程)。

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

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

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

    【讨论】:

    • 您的回答比我要求的要多。我认为这解释了有关量词的所有知识。
    • @Ariel:谢谢,但量词的意义远不止于此:)
    • 像什么?关于量词,我还应该了解什么?
    • @Ariel:例如,惰性匹配和贪婪匹配之间的区别非常相关。然后,有*+?{n,m}可供选择,每个都可以变成占有欲或懒惰。见regular-expressions.info/refrepeat.html
    【解决方案2】:

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

    贪婪的量词首先做同样的事情,但不是失败,而是“退避”并再次尝试:

    xfooxxxxxxfoo fail
    xfooxxxxxxfo fail
    xfooxxxxxxf fail
    xfooxxxxxx match
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-09
      • 2011-06-26
      • 2021-08-15
      • 2012-06-08
      • 2011-10-11
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多