正则表达式导致段错误/堆栈溢出
问题描述:
(或因此我认为)...正则表达式导致段错误/堆栈溢出
我使用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的文本非常长,我总是会得到段错误。
为什么不应该这样工作?
答
您可以通过简单地使用non-greedy matching简化您的正则表达式很多:
begin(.+?)e(.+?)begin
试一下,看看它是否效果更好。
很可能您的原始正则表达式由于|
的递归实现而导致堆栈溢出 - 或者在您的正则表达式中进行分组,这可能会与第二组中的每个字符分支。
另一方面,简单的非贪婪.+?
不需要为每个单个字符分支。
我会在左边部分保留'[^ e] +',它可能会表现更好。 – Benoit 2012-03-05 09:35:47
谢谢,它现在有效。这种回溯的事情令人头脑麻木。 – dsign 2012-03-05 09:35:53
另外,xpressive在发布模式下编译时效果会好很多(也许tail-recursion有帮助吗?)。 – dsign 2012-03-05 09:47:45