用勉强,贪婪和占有量词捕捉群体

我在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结束。

而对于所有格,不应该只尝试一次输入吗? 由于尝试了所有可能性,我尤其感到困惑。

提前致谢 !


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

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

aababaabab使用.*?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正在成为正则表达式相关问题的一个很好的参考。

链接地址: http://www.djcxy.com/p/13421.html

上一篇: Using capturing groups with reluctant, greedy, and possessive quantifiers

下一篇: How exactly does the possessive quantifier work?