Emacs 的正则表达式实现与同类工具一样,总体上非常健壮,但偶尔会以两种方式引发问题: 匹配可能耗尽内部栈空间并抛出错误,或者匹配耗时过长。 以下建议可以降低这些问题出现的概率,并缓解已发生的问题。
\`)将正则表达式锚定在行、字符串或缓冲区的开头。
这能利用实现中的快速路径,避免无效的匹配尝试。
其他零宽断言也可能通过让匹配提前失败带来优化效果。
(这是一种权衡:匹配成功的选择模式,将最常匹配的模式放在前面会运行更快。)
对嵌套重复要格外小心:存在歧义时,它们很容易导致匹配速度极慢。 例如,‘\(?:a*b*\)+c’ 在尝试匹配中等长度的 ‘a’ 字符串时, 失败前会耗时很久。等价的 ‘\(?:a\|b\)*c’ 快得多, 而 ‘[ab]*c’ 效果更好。
rx(see rx 结构化正则表达式表示法);它可以自动优化部分选择模式,
并且除非显式请求,否则不会生成捕获组。
如果遵循以上建议后仍然遇到正则表达式栈溢出, 不妨通过多次函数调用执行匹配,每次使用更简单的正则表达式, 更容易控制回溯行为。
为了帮助诊断正则表达式或正则表达式引擎本身的问题,
该函数返回一个字符串,描述 regexp 的编译形式。
要理解其含义,可能需要阅读 Emacs 源代码中 src/regex-emacs.c 文件
里关于 re_opcode_t 类型的说明。
当前仅当 Emacs 使用 --enable-checking 编译时,
该函数才能给出有意义的描述。