为什么在Java正则表达式中星形量词比加号量词更贪婪?
我试图从为什么在Java正则表达式中星形量词比加号量词更贪婪?,java,regex,regex-greedy,Java,Regex,Regex Greedy,我试图从LogicalID和SupplyChain中提取文本 <LogicalID>SupplyChain</Logical> 在一阵绝望中,我试着用星号代替加号: .*([A-Za-z]*)>([A-Za-z]+)<.* *([A-Za-z]*)>([A-Za-z]+)您真的应该使用这个正则表达式: <([A-Za-z]+)>([A-Za-z]+)< ([A-Za-z]+)< 或 ([A-Za-z]+)< 两者将分别匹配Logi
LogicalID
和SupplyChain
中提取文本
<LogicalID>SupplyChain</Logical>
在一阵绝望中,我试着用星号代替加号:
.*([A-Za-z]*)>([A-Za-z]+)<.*
*([A-Za-z]*)>([A-Za-z]+)您真的应该使用这个正则表达式:
<([A-Za-z]+)>([A-Za-z]+)<
([A-Za-z]+)<
或
([A-Za-z]+)<
两者将分别匹配LogicalID
和SupplyChain
PS:你的正则表达式:*([A-Za-z]*)>([A-Za-z]+)贪婪程度没有区别。在您的第一个正则表达式中:
.*([A-Za-z]+)>([A-Za-z]+)<.*
您需要任意数量的字符,后跟任意数量的字母,然后是
。因此,第一个*消耗了
之前的所有内容,第一个捕获组匹配一个空字符串。我认为它一点也不“完美匹配”
它并不表示贪婪
第一个正则表达式*([A-Za-z]+)>([A-Za-z]+)([A-Za-z]+)我认为这不能回答问题。@kocko:请详细说明为什么不能。我写了OP的正则表达式*([A-Za-z]*)>([A-Za-z]+)<将空字符串作为第一个匹配项进行匹配。
问题是“为什么*
比+
更贪婪?”@kocko:OP的“观察”(即*
比+
更贪婪)似乎是基于一个错误;他认为他的第二个正则表达式“完美”匹配,而事实上它使捕获组匹配了一个空字符串。@kocko:这就是我试图关注的,OP的观察结果,*比+
更贪婪是不对的。(还添加了一个工作演示来展示代码示例)。你说的greedier是什么意思?你试过用+
更换位置吗?看起来这里重要的不是贪婪,而是放置它们的顺序。看起来贪婪,实际上是执行的顺序。我从@Airos的下面的答案中收集到了这一点。将?
放在第一个正则表达式中的*
之后也会使匹配工作正常,即*?([A-Za-z]+)>([A-Za-z]+)
<([A-Za-z]+)>([A-Za-z]+)<
<([A-Za-z]*)>([A-Za-z]+)<
.*([A-Za-z]+)>([A-Za-z]+)<.*
.*([A-Za-z]*)>([A-Za-z]+)<.*
Why is * greedier than +?