有人可以解释.+
和.+?
我有字符串:"extend cup end table"
e.+d
找到:extend cup end
e.+?d
找到:extend
和end
我知道+
是一个或多个,?
是一个或零。
但我无法理解它是如何运作的。
答案 0 :(得分:26)
两者都匹配一个或多个字符的任何序列。区别在于:
.+
贪婪并消耗尽可能多的字符。.+?
不情愿并消耗尽可能少的字符。请参阅Java教程中的Differences Among Greedy, Reluctant, and Possessive Quantifiers。
因此:
e.+d
找到以e
开头且以d
结尾的最长子字符串(并且其间至少包含一个字符)。在您的示例中,将找到extend cup end
。e.+?d
找到最短的子字符串。在您的示例中,extend
和end
是两个非重叠匹配,因此它会找到两者。答案 1 :(得分:7)
正则表达式e.+?d
与'e'
匹配,然后尝试匹配尽可能少的字符(不同意或不情愿),然后是'd'
。这就是为什么匹配以下2个子串:
extend cup end table
^^^^^^ ^^^
1 2
正则表达式e.+d
与'e'
匹配,然后尝试匹配尽可能多的字符(贪婪),然后是'd'
。会发现第一个'e'
,然后.+
尽可能匹配(直到行尾或输入):
extend cup end table
^^^^^^^^^^^^^^^^^^^^
正则表达式引擎到达行(或输入)的末尾,并且与正则表达式模式中的'd'
不匹配。所以它回溯到最后的'd'
。这就是找到单一匹配的原因:
extend cup end table
^^^^^^^^^^^^^^<----- backtrack
1