众所周知,正则表达式引擎在工作时会使用两条规则:
这些行出现在教程中:
这两条规则齐头并进。
它渴望给你一个结果,所以它做的是它试图公正 继续让第一个完成所有工作。
虽然我们已经处于中间位置,但让我们继续前进吧 字符串的结尾,然后当它没有工作时,它会 回溯并尝试另一个。
它没有回溯到开头;它没有尝试各种各样的 其他组合。
它仍然渴望得到一个结果,所以它说,如果我刚才给了 回来一个?
这会让我回复一下结果吗?
如果确实如此,那就完成了。它能够在那里完成。
它不需要在字符串中继续进行回溯,看起来 为某种更好的匹配或匹配进一步发展。
我不太明白这些行(尤其是第二行(“我们正在......”)和最后一行(“它不必保持回溯”)句子)。< / p>
这些关于懒惰模式的内容。
它仍然像贪婪的那样推迟整体比赛
我不明白以下类比:
选择懒惰策略或不一定更快或更慢 一个贪婪的策略,但它可能会匹配不同的东西。
现在,无论是更快还是更慢,都有点像说,如果 你丢失了车钥匙和你家里的太阳镜,是吗? 最好开始在厨房里寻找或者开始寻找 客厅?
你不知道哪一个会产生最好的结果,而你 不知道哪一个会先找到太阳镜或钥匙 第一;这只是开始搜索的不同策略。
因此,根据您的起点,您可能会得到不同的结果, 但是在一个地方或另一个地方开始并不一定快。
“更快还是更慢”意味着什么?
我将绘制方案如何工作(两种情况)。所以我会考虑这些问题,直到我发现这里发生了什么!) 我需要准确无误地理解它。
感谢。
答案 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的链接很清楚,我不会在这里重复。