用勉强,贪婪和占有量词捕捉群体
我在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结束。
而对于所有格,不应该只尝试一次输入吗? 由于尝试了所有可能性,我尤其感到困惑。
提前致谢 !
正则表达式引擎从左边开始逐个检查(基本上)你的字符串的每个字符,试图使它们适合你的模式。 它返回找到的第一个匹配项。
应用于子模式的不情愿量词意味着正则表达式引擎会优先考虑(如在先尝试)以下子模式。
在aabab
上aabab
使用.*?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