“。+”和“。+?”之间的区别

时间:2013-01-08 11:20:23

标签: regex

有人可以解释.+.+?

之间的区别

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

  1. 模式e.+d找到:extend cup end
  2. 模式e.+?d找到:extendend
  3. 我知道+是一个或多个,?是一个或零。 但我无法理解它是如何运作的。

2 个答案:

答案 0 :(得分:26)

两者都匹配一个或多个字符的任何序列。区别在于:

  • .+ 贪婪并消耗尽可能多的字符。
  • .+? 不情愿并消耗尽可能少的字符。

请参阅Java教程中的Differences Among Greedy, Reluctant, and Possessive Quantifiers

因此:

  • e.+d找到以e开头且以d结尾的最长子字符串(并且其间至少包含一个字符)。在您的示例中,将找到extend cup end
  • e.+?d找到最短的子字符串。在您的示例中,extendend是两个非重叠匹配,因此它会找到两者。

答案 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