到目前爲止,在我對正則表達式的研究中,我得出的結論是,無論什麼時候出現回溯,當前「在回溯點」的標記將會嘗試擴展(假設它之後是一個懶惰的量詞;例如,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",
不會出現任何問題,但現在我想知道我是否得到了正確的回溯概念
。
有人可以請說一說嗎?
在這個特殊性和細節層面上,最好先決定一個特定的正則表達式引擎,然後嘗試發現它的行爲。 – chb 2012-08-04 20:01:51
我正在看Java中的正則表達式行爲,但在這種情況下真的很重要嗎? – 2012-08-05 01:02:31