.+
有人可以解释和之间的区别吗.+?
我有字符串:"extend cup end table"
- 该模式
e.+d
发现:extend cup end
- 模式
e.+?d
发现:extend
和end
我知道那+
是一或多,?
是一或零。但我无法理解它是如何工作的。
.+
有人可以解释和之间的区别吗.+?
我有字符串:"extend cup end table"
e.+d
发现:extend cup end
e.+?d
发现:extend
和end
我知道那+
是一或多,?
是一或零。但我无法理解它是如何工作的。
两者都将匹配一个或多个字符的任何序列。不同之处在于:
.+
是贪婪的,并尽可能多地消耗字符。.+?
不情愿并且尽可能少地消耗字符。请参阅Java 教程中的Greedy、Reluctant 和 Possessive 量词之间的差异。
因此:
e.+d
查找以 开头e
和结尾的最长子字符串d
(并且在两者之间至少包含一个字符)。在你的例子extend cup end
中会找到。e.+?d
找到最短的这样的子串。在您的示例中,extend
andend
是两个这样的非重叠匹配项,因此它找到了两者。正则表达式e.+?d
匹配 an 'e'
,然后尝试匹配尽可能少的字符(不贪婪或不情愿),然后是'd'
. 这就是匹配以下 2 个子字符串的原因:
extend cup end table
^^^^^^ ^^^
1 2
正则表达式e.+d
匹配 an'e'
然后尝试匹配尽可能多的字符(贪婪),然后是 a 'd'
。发生的情况'e'
是找到第一个,然后.+
尽可能多地匹配(直到行尾或输入):
extend cup end table
^^^^^^^^^^^^^^^^^^^^
正则表达式引擎到达行尾(或输入),无法匹配'd'
正则表达式模式中的。所以它回溯到最后一个'd'
被看见的地方。这就是找到单个匹配项的原因:
extend cup end table
^^^^^^^^^^^^^^<----- backtrack
1