regex performance rust compsci

The Quadratic Problem Nobody Fixed

Source: iev.ee | Rating: ★★★★★

核心发现

每个正则表达式引擎在寻找所有匹配时都存在 O(n²) 的性能问题,即使是为避免回溯而构建的引擎也不例外。这个问题自 1970 年代以来就存在,但从未被真正解决。

问题本质

以模式 .*a|b 和输入 "bbbbbbbbbb" 为例:

现有解决方案

引擎方法权衡
nim-regex单次扫描 + 缓冲区最多 16x 内存开销
Hyperscanearliest match 语义改变匹配结果
RE#两遍扫描保持语义,线性时间

RE# 的两遍算法

RE# 通过两遍扫描解决此问题:

  1. 反向 DFA:标记所有可能的匹配起点
  2. 正向 DFA:从标记位置解析最长匹配

一个匹配或一万个匹配,都是相同的两遍扫描。

性能对比

输入大小普通模式Hardened 模式加速比
1,0000.7ms28μs25x
10,00073ms303μs241x
50,0001.8s1.6ms1125x

关键洞见


探索时间: 2026-03-29 | 来源: Lobsters/compsci