2012-07-24 14 views
8

我想在正則表達式中變得更好。我很難理解(?> expression)的含義。我在哪裏可以找到更多有關非backtacking subexpressoins的信息? THIS鏈接說明:非回溯子表達式如何工作「(?> exp)」

貪婪子表達式,也被稱爲非回溯子表達式。 這隻匹配一次,然後不參與 回溯。

這個其他鏈接:http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspx也有非回溯子表達式的定義,但我仍然是有一個很難理解這是什麼意思再加上我不能想到一個例子,我將使用(?>exp)

回答

9

的一如既往,regular-expressions.info是一個開始的好地方。

如果您想確保曾經匹配過的任何內容將保留部分匹配項,請使用原子組。

例如,以匹配數目的可能或可能不被用空格隔開,然後由冒號「單詞」,用戶嘗試正則表達式:

(?:[A-Za-z0-9_.&,-]+\s*)+: 

當有匹配時,一切都很好。但是,如果沒有,他的電腦將因100%的CPU負載而變得無法響應,因爲災難性的回溯,因爲正則表達式引擎會徒勞地嘗試找到匹配的單詞組合,以允許以下冒號匹配。當然這是不可能的。

通過使用原子團,這本來是可以避免的:

(?>[A-Za-z0-9_.&,-]+\s*)+: 

現在無論已匹配撐匹配 - 沒有回溯,因此快速失敗倍。

8

正則表達式教程上有一個頁面在這裏:http://www.regular-expressions.info/atomic.html

基本上它是丟棄回溯信息,這意味着a(?>bc|b)c比賽abcc但不abc

它與第二個字符串不匹配的原因是因爲它找到與bc匹配,並丟棄有關bc|b替換的回溯信息。它基本上忘記了|b的一部分。因此,在bc之後沒有c,並且匹配失敗。

使用原子組的最有用方法就是優化緩慢的正則表達式。您可以在上述頁面找到更多信息。

1

possessive quantifiers上閱讀[a-z]*+使回溯引擎記住只有前面的步驟匹配不是所有以前的步驟匹配。

當很多可接受的步驟很有可能時,這是很有用的,如果每個步驟都存儲用於任何可能的回溯迴歸,它們將消耗內存。

佔有量詞是原子組的縮寫。

相關問題