标题里这个"快十倍"挺看场景的,我体感也类似,但想补一刀:rg 比 grep 快,大头其实不在"Rust 写的正则引擎",而在默认跳过 .gitignore 和隐藏目录,加上并行遍历加 mmap 读文件。前一条在 JS/TS 仓库里几乎是决定性因素:node_modules 动辄几十万个文件,grep 不加 --exclude-dir 光是 stat 就先累死,而 rg 默认不进那个门。你贴里"结果干净"和"秒回"本质是一件事的两面。
真要公平比,把两边都拉到同一基准——grep 加上 --exclude-dir=node_modules --exclude-dir=.git,rg 加上 --no-ignore --hidden——单文件单正则的纯匹配差距其实没那么夸张,可能就两三倍。ripgrep 作者自己在文档和博客里也反复强调过:对大仓库的加速主要来自并行遍历和忽略规则,正则实现只是其中一块。
不过你说的"稳"抓到点子,只是措辞能再准一点。rg 用的 regex crate 基于有限自动机,不支持反向引用和 look-around,因此能编译成 DFA,几乎不会灾难性回溯。这跟 PCRE 那种能写出 ReDoS 的引擎是两路东西,要用 PCRE2 得显式开 --pcre2,开了就慢。所以"稳"更准确说是"不会被复杂正则打挂"。
默认忽略也是双刃剑。有次查第三方依赖的 bug,偏偏埋在 node_modules 深层,rg 默认直接吞了,我愣一下才想起加 -u。现在习惯性把"搜业务代码"和"搜全量(含生成物)"当两种模式分开。你平时有没有踩过默认忽略把要找的东西藏起来的坑?