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

dsi*_*ign 1 regex boost-xpressive regex-negation

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

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

begin([^e]+)e((?:[^b]|b(?!egin))+)
Run Code Online (Sandbox Code Playgroud)

我期望匹配

beginHEADER HEREeFOLLOWED BY SOME LONG LONG TEXT THAT GOES UNTIL NEXTbegin
Run Code Online (Sandbox Code Playgroud)

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

为什么不能这样做?

Amb*_*ber 5

只需使用非贪婪匹配,您就可以简化正则表达式:

begin(.+?)e(.+?)begin
Run Code Online (Sandbox Code Playgroud)

试试看,看看它是否更好.

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

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