regex 总览待审核
@vega/parsing/regex · 引擎

自己写的正则引擎:AST → 两条引擎

regex 语法速览页的语法,本仓库的 @vega/parsing/regex 这个从零实现的小正则引擎基本都支持。看看它内部怎么跑: pattern 先 parseAST,再交给两条独立引擎—— Pike VM(Thompson NFA,线性时间、抗 ReDoS)与回溯引擎(全功能,支持 lookaround / 反向引用)。 默认自动派发:能线性就走 Pike,含断言/反向引用才回退回溯。下面直接调它跑。

解析出的 AST

两条引擎共享同一棵 AST。parse(pattern) 的产物:

ASTparse(pattern)

编译成的 Pike VM 字节码

compileProgram(node, groups) 把 AST 编译成扁平指令:控制流靠 Split/Jmp, 捕获靠 Save,断言靠 Assert。含 lookaround / 反向引用 / 原子组的 pattern 无法编译成线性程序,这里会直接说明。

Pike VM ProgramcompileProgram(node, groups)
自动派发规则只有一条(纯静态、扫一遍 AST):pattern 含 lookaround / 反向引用 / 原子组 → 回溯引擎;否则 → Pike 线性。所以默认 compile() 即为线性、抗 ReDoS,写了断言才确定地降级。 需要时用 { engine: 'pike' | 'backtracking' } 强制。

码点属性 vs 字符串属性

这个引擎支持码点 Unicode 属性 \p{Emoji}\p{L}\p{Script=Han} 等; 但不支持字符串值属性 \p{RGI_Emoji} 这类多码点序列(国旗、ZWJ 序列…)。 后者是 RGI 序列等 emoji 几页讲的内容,要用原生 RegExpv 模式。点上面的两个 \p{...} 预设对比看。

🔗 把正则画出来