(或者我认为)......
我正在使用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组匹配的文本很长,我总是得到段错误。
为什么不能这样做?
答案 0 :(得分:5)
只需使用non-greedy matching:
即可简化正则表达式begin(.+?)e(.+?)begin
尝试一下,看看它是否效果更好。
由于|
的递归实现或正则表达式中的分组,您的原始正则表达式可能导致堆栈溢出,这可能会分支您的第二组中的每个字符。
另一方面,简单的非贪婪.+?
不需要为每个字符分支。