正则表达式懒惰量词

时间:2015-02-28 12:48:01

标签: regex

假设我有字符串Heeello。有人可以告诉我为什么正则表达式/H(e+)llo/和正则表达式/H(e+?)llo/返回相同的组eee,虽然第一个是贪婪而第二个是懒惰的(所以它应该返回e)?

2 个答案:

答案 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之前的所有内容。

DEMO

这两个正则表达式将完成同样的工作。你不需要使用非贪婪的形式。

^.*$
^.*?$

答案 1 :(得分:0)

懒惰的正则表达式尝试用尽可能少的努力找到匹配。 如果您必须将 heeee / H(e +?)/ 匹配,那么您将得到他。并使用 / H(e +)/ heeee

但是由于 e 的序列必须跟随 llo ,所以即使是懒惰的正则表达式也必须捕获所有 e 才能找到< EM> LLO