使用不情愿,贪婪和占有欲量词的捕获组

时间:2014-05-05 14:28:31

标签: java regex

我在Oracle教程中练习java的正则表达式。为了更好地理解贪婪,不情愿和占有欲的量词,我创造了一些例子。我的问题是这些量词在捕捉群体时如何运作。我不明白以这种方式使用量词,例如,不情愿的量词看起来好像根本不起作用。此外,我在互联网上搜索了很多,只看到像(。*?)这样的表达式。有没有理由为什么人们通常使用带有该语法的量词,而不是“(.foo)??”?

这是不情愿的例子:

  

输入你的正则表达式:(。foo)??

     

输入要搜索的输入字符串:xfooxxxxxxfoo

     

我发现文本“”从索引0开始,到索引0结束。

     

我发现文本“”从索引1开始,到索引1结束。

     

我发现文本“”从索引2开始,到索引2结束。

     

我发现文本“”从索引3开始,到索引3结束。

     

我发现文本“”从索引4开始,到索引4结束。

     

我发现文本“”从索引5开始,到索引5结束。

     

我发现文本“”从索引6开始,到索引6结束。

     

我发现文本“”从索引7开始,到索引7结束。

     

我发现文本“”从索引8开始,到索引8结束。

     

我发现文本“”从索引9开始,到索引9结束。

     

我发现文本“”从索引10开始,到索引10结束。

     

我发现文本“”从索引11开始,到索引11结束。

     

我发现文本“”从索引12开始,到索引12结束。

     

我发现文本“”从索引13开始,到索引13结束。

对于不情愿,它不应该为索引0和4显示“xfoo”吗?以下是占有欲:

  

输入你的正则表达式:(。foo)?+

     

输入要搜索的输入字符串:afooxxxxxxfoo

     

我发现文本“afoo”从索引0开始,到索引4结束

     

我发现文本“”从索引4开始,到索引4结束。

     

我发现文本“”从索引5开始,到索引5结束。

     

我发现文本“”从索引6开始,到索引6结束。

     

我发现文本“”从索引7开始,到索引7结束。

     

我发现文本“”从索引8开始,到索引8结束。

     

我发现文本“xfoo”从索引9开始,到索引13结束。

     

我发现文本“”从索引13开始,到索引13结束。

对于占有欲,它不应该只尝试输入一次吗?我特别喜欢这个因为尝试各种可能性而感到困惑。

提前致谢!

1 个答案:

答案 0 :(得分:1)

正则表达式引擎(从根本上)检查(基本上)字符串的每个字符,从左侧开始,尝试使它们适合您的模式。它返回它找到的第一个匹配。

应用于子模式的不情愿量词意味着正则表达式引擎将优先考虑(如在第一次尝试)以下子模式。

通过.*?b上的aabab逐步了解会发生什么:

aabab # we try to make '.*?' match zero '.', skipping it directly to try and 
^     # ... match b: that doesn't work (we're on a 'a'), so we reluctantly 
      # ... backtrack and match one '.' with '.*?'
aabab # again, we by default try to skip the '.' and go straight for b:
 ^    # ... again, doesn't work. We reluctantly match two '.' with '.*?'
aabab # FINALLY there's a 'b'. We can skip the '.' and move forward:
  ^   # ... the 'b' in '.*?b' matches, regex is over, 'aab' is a general match

在你的模式中,没有等同于b(.foo)是可选的,引擎优先考虑模式的以下部分。

哪个没有,并且匹配空字符串:找到整体匹配,并且它总是一个空字符串。


关于占有量词,你对他们的所作所为感到困惑。他们对匹配数没有直接影响:你用来应用你的正则表达式的聊天工具并不清楚,但是它会查找全局匹配,这就是为什么它不会在第一场比赛时停止。

有关详细信息,请参阅http://www.regular-expressions.info/possessive.html

另外,正如HamZa指出的那样,https://stackoverflow.com/a/22944075正在成为正则表达式相关问题的重要参考。