Global 以 .*$ 结尾的模式替换会不必要地对整个输入进行 BitState 扫描
作者: cosu创建于 2026年3月11日更新于 2026年8月4日
在使用以 `.*$` (或 `.*`) 结尾的模式时,如果 `.*` 不包含捕获组,BitState 会扫描整个输入字符串以跟踪 .* 状态,尽管已保证会消耗剩余的字符串。 这是日志处理中一个非常常见的用例,例如使用 `^https?://(?:www\.)?([^/]+)/.*$` 来从 Web 日志中提取主机名。 一旦匹配了前面的 `.*$` 部分,就可以通过缩短匹配来避免扫描输入的剩余部分。 我通过删除后缀 `.*$` 并使用 `RE2::Extract` 而不是 `GlobalReplace` 来原型化此方法,这大大减少了 BitState 的 CPU 使用。 但是,由于匹配部分发生变化,我必须添加一个保护措施,以在替换引用 \0 (完整匹配) 时退回。 这个方法是否可靠? 我是否可能遗漏了其他边缘情况或正确性问题? 这种方法是否值得在 RE2 中原生处理?
内容来源: google/re2