正则表达式导致段错误/堆栈溢出

时间:2012-03-05 09:08:57

标签: regex regex-negation boost-xpressive

(或者我认为)......

我正在使用boost :: xpressive作为我的正则表达式引擎来解析一些东西,我得到一个段错误。我怀疑递归和我的坏正则表达式是罪魁祸首,因为gdb显示超过300个堆栈帧。所以,这是我的(区分大小写)正则表达式,用perl / python表示法:

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

我期望匹配

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin

在第一组中使用第一个大写文本( HEADER HERE ),在第二个组中使用第二个大写文本。如果与第2组匹配的文本很长,我总是得到段错误。

为什么不能这样做?

1 个答案:

答案 0 :(得分:5)

只需使用non-greedy matching

即可简化正则表达式
begin(.+?)e(.+?)begin

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

由于|的递归实现或正则表达式中的分组,您的原始正则表达式可能导致堆栈溢出,这可能会分支您的第二组中的每个字符。

另一方面,简单的非贪婪.+?不需要为每个字符分支。