假设我有字符串Heeello
。有人可以告诉我为什么正则表达式/H(e+)llo/
和正则表达式/H(e+?)llo/
返回相同的组eee
,虽然第一个是贪婪而第二个是懒惰的(所以它应该返回e
)?
答案 0 :(得分:1)
懒惰是基于以下模式。 H(e+?)llo
,此处以下字符为l
,因此为了找到匹配项,它会匹配所有e,直到达到l
。
只需从上面的正则表达式中删除以下llo
即可。现在它只捕获第一个e
。由于我们删除了以下模式llo
(即延迟量词旁边的模式),因此它必须捕获第一个e
。
将Heeee
视为输入字符串,将H(e+?)
视为正则表达式模式。
H
与字母H
匹配,e+?
将与一个或多个e
进行非贪婪匹配。所以这只匹配He
,因为它在第一次尝试后找到匹配。这里没有以下模式。
将Heeeello
视为输入字符串,将H(e+?)llo
视为正则表达式模式。
此处H
与第一个H
匹配,首先e+?
与第一个e
匹配。由于模式尚未完成,因此正则表达式引擎会选择第三个下一个模式l
。为了找到匹配项,正则表达式引擎会匹配e
以及l
之前的所有内容。
这两个正则表达式将完成同样的工作。你不需要使用非贪婪的形式。
^.*$
^.*?$
答案 1 :(得分:0)
懒惰的正则表达式尝试用尽可能少的努力找到匹配。 如果您必须将 heeee 与 / H(e +?)/ 匹配,那么您将得到他。并使用 / H(e +)/ , heeee 。
但是由于 e 的序列必须跟随 llo ,所以即使是懒惰的正则表达式也必须捕获所有 e 才能找到< EM> LLO