有人可以解释的差异之间.+和.+?
我有字符串: "extend cup end table"
e.+d发现:extend cup ende.+?d发现:extend和end我知道这+是一个或多个,?是一个或零.但我无法理解它是如何工作的.
NPE*_*NPE 33
两者都将匹配一个或多个字符的任何序列.不同之处在于:
.+是贪婪的,消耗尽可能多的角色..+?是不情愿的,消耗尽可能少的字符.请参阅Java教程中的贪婪,不情愿和占有量词之间的差异.
从而:
e.+d找到以...开头e并以其结尾的最长子字符串d(并且其间至少包含一个字符).extend cup end找到最短的子串.在你的榜样,e.+?d而且extend是两个这样的非重叠的匹配,所以它同时找到.Bar*_*ers 10
正则表达式e.+?d匹配一个'e'然后尝试匹配尽可能少的字符(不同意或不情愿),然后是a 'd'.这就是为什么匹配以下2个子串:
extend cup end table
^^^^^^ ^^^
1 2
Run Code Online (Sandbox Code Playgroud)
正则表达式e.+d匹配a 'e'然后尝试匹配尽可能多的字符(贪婪),然后是a 'd'.会发生的是第一个'e',然后.+匹配尽可能多(直到行尾或输入):
extend cup end table
^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
正则表达式引擎到达行(或输入)的末尾,并且'd'与正则表达式模式不匹配.所以它回溯到最后'd'是锯.这就是找到单一匹配的原因:
extend cup end table
^^^^^^^^^^^^^^<----- backtrack
1
Run Code Online (Sandbox Code Playgroud)