35

.+有人可以解释和之间的区别吗.+?

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

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

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

4

2 回答 2

56

两者都将匹配一个或多个字符的任何序列。不同之处在于:

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

请参阅Java 教程中的Greedy、Reluctant 和 Possessive 量词之间的差异。

因此:

  • e.+d查找以 开头e和结尾的最长子字符串d(并且在两者之间至少包含一个字符)。在你的例子extend cup end中会找到。
  • e.+?d找到最短的这样的子串。在您的示例中,extendandend是两个这样的非重叠匹配项,因此它找到了两者。
于 2013-01-08T11:22:56.860 回答
16

正则表达式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      
于 2013-01-08T11:33:32.320 回答