Regex 导致segfault/堆栈溢出的正则表达式

Regex 导致segfault/堆栈溢出的正则表达式,regex,regex-negation,boost-xpressive,Regex,Regex Negation,Boost Xpressive,或者我认为 我使用boost::xpressive作为正则表达式引擎来解析某些内容,结果得到一个segfault。我怀疑递归性和我糟糕的正则表达式是罪魁祸首,因为gdb显示了300多个堆栈帧。下面是我的区分大小写的正则表达式,用perl/python表示法: begin([^e]+)e((?:[^b]|b(?!egin))+) 我希望能匹配 beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin 第

或者我认为

我使用boost::xpressive作为正则表达式引擎来解析某些内容,结果得到一个segfault。我怀疑递归性和我糟糕的正则表达式是罪魁祸首,因为gdb显示了300多个堆栈帧。下面是我的区分大小写的正则表达式,用perl/python表示法:

begin([^e]+)e((?:[^b]|b(?!egin))+)
我希望能匹配

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin
第一组中有第一个大写文本标题,第二组中有第二个大写文本标题。如果与第2组匹配的文本很长,我总是会得到segfault


为什么这不起作用?

只需使用以下命令,即可大大简化正则表达式:

试试看,看是否效果更好

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


一个简单的非贪婪算法?另一方面,不需要为每个字符进行分支。

只需使用以下命令,即可大大简化正则表达式:

试试看,看是否效果更好

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


一个简单的非贪婪算法?另一方面,不需要为每个字符进行分支。

我会将[^e]+保留在左手部分,它的性能可能会更好。谢谢,它现在可以工作了。这种回溯方式让人麻木。此外,Xpression在发布模式下编译时工作得更好,也许尾部递归有帮助?而不是尾部递归。在发布模式下编译会导致许多函数调用内联,从而更有效地使用堆栈。我会将[^e]+保留在左侧部分,它可能会执行得更好。谢谢,它现在可以工作了。这种回溯方式让人麻木。此外,Xpression在发布模式下编译时工作得更好,也许尾部递归有帮助?而不是尾部递归。在发布模式下编译会导致许多函数调用内联,从而更有效地使用堆栈。
begin(.+?)e(.+?)begin