2012-08-04 60 views
0

到目前爲止,在我對正則表達式的研究中,我得出的結論是,無論什麼時候出現回溯,當前「在回溯點」的標記將會嘗試擴展(假設它之後是一個懶惰的量詞;例如,x *?最初抓住「x」會嘗試抓住另一個x變成「xx」)或縮小(只有在它後面跟着一個貪婪的量詞; x *,最初抓住「xxx」會嘗試釋放一個x到持有「xx」)。我的理解是,這些行爲嚴格取決於令牌後面的量詞類型。正則表達式回溯選項:收縮還是擴大?

但是這與本章提供的正則表達式教程提供的信息有些矛盾:http://www.regular-expressions.info/catastrophic.html
有作者對字符串的exapmle被搜索 -

"1,2,3,4,5,6,7,8,9,10,11,12,13" and regex - "^([^,\r\n]*,){11}P". 

此外,他指出:「如果P不能被發現時,發動機仍然會原路返回,但它會走回頭路只有11次,每次[^,\r\n]無法將擴展爲超出逗號,迫使正則表達式引擎立即進入11次迭代中的前一次,而不嘗試其他選項「。

這個詞「擴大」是讓我困惑的一個。回溯時,令牌會不會在此時擴大?如果正則表達式寫成這樣的話:"^([^,\r\n]*?,){11}P",不會出現任何問題,但現在我想知道我是否得到了正確的回溯概念

有人可以請說一說嗎?

+0

在這個特殊性和細節層面上,最好先決定一個特定的正則表達式引擎,然後嘗試發現它的行爲。 – chb 2012-08-04 20:01:51

+0

我正在看Java中的正則表達式行爲,但在這種情況下真的很重要嗎? – 2012-08-05 01:02:31

回答

1

他所說的只是[^,\r\n]*不會消耗逗號之外的字符,這是分隔符。

如果字符集不包含逗號,那麼回溯的數量會大大增加,因爲它是一個重複的子模式。

+0

他實際上是說,在這種特殊情況下_with_回溯,正則表達式引擎將無法擴展。但是這裏的正則表達式只會在第一次匹配時纔會擴展,在回溯時會縮小。這可能看起來像分詞,但對於我來說,掌握這個概念實際上非常重要。 – 2012-08-05 01:16:13