正则表达式引擎的规则。正则表达式的贪婪,渴望和懒惰

时间:2014-10-03 14:45:38

标签: regex regex-greedy

众所周知,正则表达式引擎在工作时会使用两条规则:

  • 规则1:开始最早的胜利或正则表达的比赛 很渴望。
  • 规则2:正则表达式是贪婪的。

这些行出现在教程中:

  

这两条规则齐头并进。

     

它渴望给你一个结果,所以它做的是它试图公正   继续让第一个完成所有工作。

     

虽然我们已经处于中间位置,但让我们继续前进吧   字符串的结尾,然后当它没有工作时,它会   回溯并尝试另一个。

     

它没有回溯到开头;它没有尝试各种各样的   其他组合。

     

它仍然渴望得到一个结果,所以它说,如果我刚才给了   回来一个?

     

这会让我回复一下结果吗?

     

如果确实如此,那就完成了。它能够在那里完成。

     

它不需要在字符串中继续进行回溯,看起来   为某种更好的匹配或匹配进一步发展。

我不太明白这些行(尤其是第二行(“我们正在......”)和最后一行(“它不必保持回溯”)句子)。< / p>

这些关于懒惰模式的内容。

  

它仍然像贪婪的那样推迟整体比赛

  • 清楚。

我不明白以下类比:

  

选择懒惰策略或不一定更快或更慢   一个贪婪的策略,但它可能会匹配不同的东西。

     

现在,无论是更快还是更慢,都有点像说,如果   你丢失了车钥匙和你家里的太阳镜,是吗?   最好开始在厨房里寻找或者开始寻找   客厅?

     

你不知道哪一个会产生最好的结果,而你   不知道哪一个会先找到太阳镜或钥匙   第一;这只是开始搜索的不同策略。

     

因此,根据您的起点,您可能会得到不同的结果,   但是在一个地方或另一个地方开始并不一定快。

“更快还是更慢”意味着什么?

我将绘制方案如何工作(两种情况)。所以我会考虑这些问题,直到我发现这里发生了什么!) 我需要准确无误地理解它。

感谢。

1 个答案:

答案 0 :(得分:1)

让我们试试这个例子

输入this is input for test input on regex和正则表达式/this.*input/

匹配将为this is input for test input

将要做的是

  • 开始检查字符串,它将与this is input匹配

  • 但现在它位于字符串的中间位置,它将继续查看它是否可以匹配更多(这是While we're already in the middle of it, let's keep going

  • 匹配到this is input for test input并一直持续到字符串结尾

  • 最后,那些不属于比赛的东西,所以翻译&#34;回溯&#34;到最后一次匹配。

最后一部分更多关于ored regexes

将输入字符串视为cdacdgabcdef和正则表达式(ab|a).*

一个常见的错误是认为它将返回更精确的一个(在这种情况下&#39; abcdef&#39;)但它将返回&#39; acdgabcdef&#39;因为a匹配是第一个匹配。

这里发生的事情是:有一些与此部分匹配的东西,让我们继续下一部分模式,忘掉这部分中的其他选项。

对于懒惰和贪婪的问题,@ AvinashRaj的链接很清楚,我不会在这里重复。