2012-03-05 182 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