1

(或者我认为)...

我使用 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 组的文本很长,我总是会收到段错误。

为什么不应该这样做?

4

1 回答 1

5

您可以通过简单地使用非贪婪匹配来大大简化您的正则表达式:

begin(.+?)e(.+?)begin

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

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

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

于 2012-03-05T09:15:57.083 回答