-1

我在这个网站和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 结尾。但是当我收到运行程序时不匹配的声明时!这是怎么发生的,我应该怎么做仍然使用(+)量词来接收匹配?提前致谢

4

2 回答 2

0

所有格量词意味着没有进行回溯。

当您尝试匹配时会发生mdfoo什么.*+foo

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

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

于 2014-06-02T14:21:49.017 回答
0

量词分为三种:

  • “常规”量词(*、+、?)也称为“贪婪”量词;
  • “懒惰”,量词(*?,+?,??);
  • “占有”量词(*+、++、?+)。

例如,采用以下输入:

The answer is 42

现在,使用这个正则表达式:

.*(\d+)

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

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

为什么:

  • 贪婪的量词吞噬了它所能吞噬的一切;但是,它会在途中保留匹配的位置;吞下全文后,仍有\d+匹配;它会不情愿地回溯,直到\d+满意,并且\d+满意2
  • 惰性量词尝试并查询以下正则表达式标记:“如果 \d+ 不匹配,则我吞下下一个字符”;当遇到4它时,让它\d+做它的工作,因此42被捕获;
  • 所有格量词是所有格;它的作用类似于贪心量词,只是它不保留任何位置;因此,当到达终点时,正则表达式引擎会询问“好的,你能回馈吗?”,.*+说“不......”,因此不匹配。
于 2014-06-02T14:23:00.757 回答