贪婪和懒惰的正则表达式(理解题)

erc*_*rch 5 command-line grep regular-expression

我正在自学正则表达式,我陷入了“贪婪”与“懒惰”重复的困境。

到目前为止我发现的是

  • »greedy« 意味着 RegExp 寻找尽可能多的匹配项,其中
  • »lazy« 意味着 RegExp 寻找尽可能少的匹配项

我发现的大多数文章都涉及 a) 在编程语言中使用它,而我被困在这里grepegrep或 b) 用于grep -P激活Perl Mode;但由于我对 Perl 一无所知,这对我来说并不是很有帮助。

我的理解问题:我来到了这个大锤方法:

  • 懒惰的重复将寻找最短的匹配
  • 如果结果太长 → 调低中继器 ?
  • 如果结果仍然太长 → 寻找其他解决方案

这就是我通过 HTML 代码的示例和实验得出的结论,在那里我得到了一些但不是压倒性的结果。

如果有人能告诉我我的总结是否以及在哪里遗漏了一些要点,我将不胜感激。

fro*_*utz 4

这不是最短的比赛,只是一场短暂的比赛。贪婪模式尝试找到最后一个可能的匹配,惰性模式尝试找到第一个可能的匹配。但第一个可能的匹配不一定是最短的。

获取输入字符串foobarbaz和正则表达式o.*a(贪婪)或o.*?a(惰性)。

此输入字符串中可能的最短匹配项是oba

然而,正则表达式从左到右查找匹配项,因此会找到中的o第一个。如果模式的其余部分产生匹配,则它就保留在那里。ofoobarbaz

在第一个之后o.*(贪婪)吃掉obarbaz(整个字符串),然后回溯以匹配模式的其余部分(a)。因此它找到了最后一个 abaz并最终匹配oobarba

在第一个之后o.*?(惰性)不会吃掉整个字符串,而是查找模式其余部分的第一次出现。所以首先它看到第二个o不匹配的a,然后它看到b不匹配的a,然后它看到a匹配的a,因为它是懒惰的,所以它就停止了。(结果是ooba,但不是oba

因此,虽然它不是最短的版本,但它比贪婪版本更短。