ripgrep 报 Compiled regex exceeds size limit of 10485760 bytes 时如何调大正则大小限制
【免费下载链接】ripgrepripgrep recursively searches directories for a regex pattern while respecting your gitignore项目地址: https://gitcode.com/GitHub_Trending/ri/ripgrep
使用 ripgrep 时,如果传入的正则特别大,或者传入了大量较小的模式,模式在编译阶段可能触达一个预置的大小上限,搜索直接失败并报出如下错误(FAQ 中的示例):
$ rg '\pL{1000}' Compiled regex exceeds size limit of 10485760 bytes.这里的数字 10485760(约 10 MB)是编译后正则允许占用的内存上限。rg '\pL{1000}'这样的模式看起来不长,但\pL是包含所有 Unicode 字母的字符类,本身就很庞大,再重复 1000 次,编译后的对象就超出了默认限额。解决办法是显式调大这个限制,而不是改写模式本身。
确认触发原因:模式超出编译限额,而非语法错误
报错信息里的 “Compiled regex exceeds size limit of 10485760 bytes” 只在一个条件下出现:模式语法本身没有问题,但编译产物超过了regex-size-limit的当前值。这个信息格式来自 ripgrep 的正则错误处理代码(error.rs),当底层编译错误携带 size limit 时才拼出这条消息。
判断是否属于本场景:
- 同一模式不加任何限制参数时稳定报
Compiled regex exceeds size limit of ...; - 换回普通小模式(例如普通单词、
[0-9]\w+之外的简单模式)则能正常搜索。
如果你的报错是syntax error一类的提示,那属于模式语法问题,调大限额不会有帮助。
用 --regex-size-limit 调大限额
在命令上追加--regex-size-limit,把允许用于构造正则匹配器的内存上限调大即可(FAQ 给出的操作路径):
$ rg '\pL{1000}' --regex-size-limit 1G参数取值规则(见 flags 定义 中的文档说明):
- 接受
K、M、G后缀,分别表示 kilobytes、megabytes、gigabytes; - 不带后缀时按字节(bytes)解释;
- 写法支持
--regex-size-limit 1G和--regex-size-limit=1G两种形式。
两点来自文档的说明需要记住:
- 调大到 1GB 并不意味着 ripgrep 一定会用掉那么多内存。这个限额只是“允许”构造正则时大约占用那么多内存,实际用量由模式本身决定;
- 这个参数本身是让用户主动允许 ripgrep 花更多时间和/或内存来构建匹配器的开关,所以按需设置,不要无脑顶到最大。
--regex-size-limit标志自 0.5.2 版本引入(见 CHANGELOG),如果你手头的 ripgrep 比这更老,需要先升级版本才能使用。
验证是否生效
判断依据仍然是报错是否消失:加上参数后,之前报Compiled regex exceeds size limit of 10485760 bytes的命令应当能进入正常搜索并输出匹配结果,而不再在编译阶段失败。
如果调大后仍然报错,说明编译产物还是超了新限额,继续按同样方式加大数值即可;如果报错变成了语法错误等其他文本,则问题不在大小限制上。
一个边界:PCRE2 模式不适用此参数
测试代码中有一条明确注释:--regex-size-limitdoesn't apply to PCRE2(见 feature.rs)。也就是说,如果你用--pcre2启用 PCRE2 正则引擎,调大--regex-size-limit不会改变其编译行为,遇到限额类错误时需要另行处理。默认的 Rust 正则引擎下,本文路径有效。
参考
- 场景与命令示例:FAQ.md(“How do I get around the regex size limit?” 一节)
- 参数取值格式与说明:crates/core/flags/defs.rs
- 错误信息来源:crates/regex/src/error.rs
- 版本引入记录:CHANGELOG.md(0.5.2 条目)
【免费下载链接】ripgrepripgrep recursively searches directories for a regex pattern while respecting your gitignore项目地址: https://gitcode.com/GitHub_Trending/ri/ripgrep
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考