为什么星形量词比Java正则表达式中的加号量词更贪婪?

时间:2013-12-09 17:27:34

标签: java regex regex-greedy

我有正在尝试从LogicalIDSupplyChain

中提取的文字
 <LogicalID>SupplyChain</Logical>

起初我使用了以下正则表达式:

.*([A-Za-z]+)>([A-Za-z]+)<.*

匹配如下:

["D", "SupplyChain"]

在绝望中,我尝试使用星号而不是加号:

.*([A-Za-z]*)>([A-Za-z]+)<.*

这完美匹配。

文档说*匹配零次或多次,+匹配一次或多次。为什么*+更贪婪?

编辑:有人向我指出,下面不是这种情况。操作顺序解释了第一个匹配组实际为空的原因。

3 个答案:

答案 0 :(得分:5)

这不是贪婪的差别。在你的第一个正则表达式:

.*([A-Za-z]+)>([A-Za-z]+)<.*

您要求任意数量的字符(.*),然后至少一个字母,然后是>。所以贪婪的比赛必须是D,因为*会消耗D之前的所有内容。

在第二个中,改为:

.*([A-Za-z]*)>([A-Za-z]+)<.*

您需要任意数量的字符,后跟任意数量的字母,然后是>。所以第一个*消耗所有内容到>,第一个捕获组匹配一个空字符串。我认为它根本不“完美匹配”。

答案 1 :(得分:2)

你应该真的使用这个正则表达式:

<([A-Za-z]+)>([A-Za-z]+)<

OR

<([A-Za-z]*)>([A-Za-z]+)<

两者将分别与LogicalIDSupplyChain匹配。

PS:您的正则表达式:.*([A-Za-z]*)>([A-Za-z]+)<匹配空字符串作为第一个匹配。

工作演示:http://ideone.com/VMsb6n

答案 2 :(得分:1)

Why is * greedier than +?

它没有表现出贪婪。

第一个正则表达式.*([A-Za-z]+)>([A-Za-z]+)<.*可以表示为

enter image description here

此处Group1应该需要提供一个或多个匹配时间。

第二个.*([A-Za-z]*)>([A-Za-z]+)<.*

enter image description here

这里Group1应该需要零次或多次匹配。