2014-10-03 123 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的鏈接足夠清晰,我不會在這裏重複。