2012-03-05 64 views
1

(或因此我認爲)...正則表達式導致段錯誤/堆棧溢出

我使用boost :: xpressive中爲我的正則表達式引擎解析的東西,我得到一個段錯誤。我懷疑遞歸和我的糟糕的正則表達式都是怪罪,因爲gdb顯示了超過300個堆棧幀。所以,這裏是我的(區分大小寫)的正則表達式,在Perl/Python的符號:

begin([^e]+)e((?:[^b]|b(?!egin))+) 

,我期待與第一大寫文字匹配

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin 

HEADER這裏)在第一組和第二組中的第二個大寫文本。如果應該匹配組2的文本非常長,我總是會得到段錯誤。

爲什麼不應該這樣工作?

回答

5

您可以通過簡單地使用non-greedy matching簡化您的正則表達式很多:

begin(.+?)e(.+?)begin 

試一下,看看它是否效果更好。

很可能您的原始正則表達式由於|的遞歸實現而導致堆棧溢出 - 或者在您的正則表達式中進行分組,這可能會與第二組中的每個字符分支。

另一方面,簡單的非貪婪.+?不需要爲每個單個字符分支。

+0

我會在左邊部分保留'[^ e] +',它可能會表現更好。 – Benoit 2012-03-05 09:35:47

+0

謝謝,它現在有效。這種回溯的事情令人頭腦麻木。 – dsign 2012-03-05 09:35:53

+0

另外,xpressive在發佈模式下編譯時效果會好很多(也許tail-recursion有幫助嗎?)。 – dsign 2012-03-05 09:47:45