我有正在尝试从LogicalID
和SupplyChain
<LogicalID>SupplyChain</Logical>
起初我使用了以下正则表达式:
.*([A-Za-z]+)>([A-Za-z]+)<.*
匹配如下:
["D", "SupplyChain"]
在绝望中,我尝试使用星号而不是加号:
.*([A-Za-z]*)>([A-Za-z]+)<.*
这完美匹配。
文档说*
匹配零次或多次,+
匹配一次或多次。为什么*
比+
更贪婪?
答案 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]+)<
两者将分别与LogicalID
和SupplyChain
匹配。
PS:您的正则表达式:.*([A-Za-z]*)>([A-Za-z]+)<
匹配空字符串作为第一个匹配。
答案 2 :(得分:1)
Why is * greedier than +?
它没有表现出贪婪。
第一个正则表达式.*([A-Za-z]+)>([A-Za-z]+)<.*
可以表示为
此处Group1应该需要提供一个或多个匹配时间。
第二个.*([A-Za-z]*)>([A-Za-z]+)<.*
为
这里Group1应该需要零次或多次匹配。