Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java正则表达式中星形量词比加号量词更贪婪?_Java_Regex_Regex Greedy - Fatal编程技术网

为什么在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 +?