对占有量词的清晰理解

时间:2014-06-02 14:07:45

标签: 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 means that a string should end with foo for it to match

在我的输入字符串中,它以foo结尾。但当我收到一份声明,说我运行我的程序时没有匹配!这是怎么回事?我应该怎样做仍然使用(+)量词来接收匹配?提前谢谢

2 个答案:

答案 0 :(得分:0)

占有量词意味着没有回溯。

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

  1. 模式的第一部分(即.*+)匹配整个字符串mdfoo
  2. 但在第一场比赛后找不到模式的第二部分(即foo
  3. 由于没有回溯,尝试立即失败
  4. 这些占有量词很清楚地解释here

答案 1 :(得分:0)

有三种类型的量词:

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

例如,请输入以下内容:

The answer is 42

现在,拿这个正则表达式:

.*(\d+)

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

  • 如果*,将会捕获的内容为2;
  • 如果*?,将会捕获的内容为42;
  • 如果*+,正则表达式不匹配。

为什么:

  • 贪婪的量词吞下了它所能做的一切;然而,它在途中保留了它所匹配的位置;吞下全文时,仍有\d+匹配;它将不情愿地回溯,直到\d+满意为止,\d+2感到满意;
  • 懒惰量词尝试并查询以下正则表达式标记:“如果\ d +不匹配,则我吞下下一个字符”;遇到4时,\d+42完成工作,因此会抓取.*+;
  • 占有量词是占有欲的;它的作用就像贪婪的量词,除了它不保留任何位置;因此,当到达终点时,正则表达式引擎会问“好的,你能回复吗?”,{{1}}说“不......”,因此没有匹配。