".+"和".+?"之间的区别

nak*_*kul 18 regex

有人可以解释的差异之间.+.+?

我有字符串: "extend cup end table"

  1. 模式e.+d发现:extend cup end
  2. 模式e.+?d发现:extendend

我知道这+是一个或多个,?是一个或零.但我无法理解它是如何工作的.

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)