2014-10-03 163 views
0

的懒惰大家都知道,正则表达式引擎使用两个规则当它有关的工作:正则表达式引擎的规则。贪婪,渴望和正则表达式

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

这些线出现在教程:

两个这些规则齐头并进。

它急于给你一个结果,所以它只是试图让 不断让第一个人做所有的工作。

虽然我们已经在它的中间,让我们继续前进,到达 结尾的字符串,然后当它不工作,然后它会 回溯并尝试另一个。

它不会回溯到开始;它不尝试其他组合的各种 。

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

请问我能给出一个结果吗?

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

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

我不太明白这些行(特别是第二(“虽然我们是......”)和最后一个(“它不具备继续回溯”)的句子)。

而这些行关于懒惰模式。

它仍然推迟到整个比赛就像贪婪的人做

  • 清楚。

我不明白,以下类推:

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

现在只要是快或慢,就好像是说,如果 你失去了你的车钥匙和你的房子里你的太阳镜,是它 更好地开始寻找在厨房或开始寻找一点点在 客厅?

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

所以你可能会得到不同的结果,具体取决于你从哪里开始, ,但在一个地方或其他地方开始并不一定更快。

“更快或更慢”是什么意思?

我要画出它的工作原理(在这两种情况下都是)。所以我会考虑这个问题,直到我发现这里发生了什么事情!) 我需要准确无误地理解它。

谢谢。

+0

http://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-of-regular-expressions – 2014-10-03 14:51:21

+1

*更快*和*更慢*这里指的是性能,找到匹配的速度或失败的速度。从你发布的教程中,你正在阅读的教程看起来不太好。我建议你看看更好的东西。 – Qtax 2014-10-03 15:28:05

回答

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继续,直到字符串的结尾

  • 最后,有些东西不属于比赛的一部分,所以解释器会“回溯”到最后一次匹配。

有关或运算的正则表达式

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

一个常见的错误是以为它会返回更精确的一个(在这种情况下,最后一部分的更'abcdef'),但它会返回'acdgabcdef',因为a匹配是第一个匹配。

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

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