Java 对所有格量词的再认识

Java 对所有格量词的再认识,java,regex,quantifiers,Java,Regex,Quantifiers,我在这个网站和java教程中读了很多关于java中所有格量词的问题和答案,但是男人们,我还是很困惑!!我不明白例如,让我们说 my regex is .*+foo my input string is mdfoo 据我了解, .(dot) means there are other characters before foo *(star) means if foo should be writen in a string form if found by regex +foo mea

我在这个网站和java教程中读了很多关于java中所有格量词的问题和答案,但是男人们,我还是很困惑!!我不明白例如,让我们说

 my regex is .*+foo
 my input string is mdfoo
据我了解,

.(dot) means there are other characters before foo

*(star) means if foo should be writen in a string form if found by regex

+foo means that a string should end with foo for it to match

在我的输入字符串中,它以foo结尾。但是当我运行我的程序时收到一条声明说没有匹配!这是如何发生的?我应该如何使用(+)量词来接收匹配项?。提前感谢

所有格量词暗示没有回溯

当您尝试将
mdfoo
*+foo
匹配时会发生什么情况:

  • 模式的第一部分(即
    *+
    )匹配整个字符串
    mdfoo
  • 但是在第一次匹配之后找不到模式的第二部分(即
    foo
  • 由于没有回溯,尝试立即失败

  • 这些所有格量词解释得很清楚。

    有三种类型的量词:

    • “常规”量词(*、+、?)也称为“贪婪”量词
    • “懒惰”,量词(*?,+?,?)
    • “所有格”量词(*+,++,?+)
    例如,以以下输入为例:

    The answer is 42
    
    现在,以这个正则表达式为例:

    .*(\d+)
    
    问题是,根据您在
    *
    中使用的
    *
    版本,
    (\d+)
    将捕获什么:

    • 如果
      *
      ,将捕获的是
      2
    • 如果
      *?
      ,将捕获的是
      42
    • 如果
      *+
      ,则正则表达式不匹配
    原因:

    • 贪婪的量词吞下它能吞下的一切;然而,它在途中保留了它所匹配的位置;吞下全文后,仍有
      \d+
      需要匹配;它将不情愿地回溯,直到满足
      \d+
      ,并且
      \d+
      满足
      2
    • 惰性量词尝试并查询以下正则表达式标记:“如果\d+不匹配,则我吞下下下一个字符”;当遇到
      4
      时,它让
      \d+
      完成它的工作,因此捕获
      42
    • 所有格量词是所有格的;它的工作原理与贪婪量词相似,只是它不保留任何位置;因此,当到达末尾时,正则表达式引擎会问“好的,你能还给我吗?”,
      *+
      说“不…”,因此不匹配

    除了我刚才提到的,还有更多:甚至…@Bart Kiers okey,我明白了,先生。我会读所有的them@spOOm谢谢,你的回答直截了当。看来我不能用所有格来帮助用户搜索东西?“好像所有格没有多大的重要性?”gikarasojokinene好吧,问题实际上是:你为什么认为你需要一个所有格量词?@spOOm我想我需要所有格来加速我的正则表达式,帮助我的正则表达式更快地失败。@spOOm这就是我所知道的所有格的好处。你能告诉我有什么好处吗?@gikarasojokinene
    ;)