自己写的正则引擎:AST → 两条引擎
regex 语法速览页的语法,本仓库的 @vega/parsing/regex 这个从零实现的小正则引擎基本都支持。看看它内部怎么跑:
pattern 先 parse 成 AST,再交给两条独立引擎——
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)
lookaround / 反向引用 / 原子组
→ 回溯引擎;否则 → Pike 线性。所以默认 compile() 即为线性、抗 ReDoS,写了断言才确定地降级。
需要时用 { engine: 'pike' | 'backtracking' } 强制。
码点属性 vs 字符串属性
这个引擎支持码点 Unicode 属性 \p{Emoji}、\p{L}、\p{Script=Han} 等;
但不支持字符串值属性 \p{RGI_Emoji} 这类多码点序列(国旗、ZWJ 序列…)。
后者是 RGI 序列等 emoji 几页讲的内容,要用原生 RegExp 的 v 模式。点上面的两个 \p{...} 预设对比看。
🔗 把正则画出来
- Regex-Vis · regex-vis.com 把 pattern 解析成可视化节点图,还能在图上直接编辑、反向生成正则——和本页的 AST 树正好对照着看。
- Regexper · regexper.com 把正则画成 railroad diagram(铁路图),分支 / 量词 / 分组的嵌套结构一眼看清。
- regex → FSA 示例集 · nark.cc 把正则编译成自动机并画出 NFA / DFA / 最小化 DFA(IP、ISO 日期、3 的倍数等示例)——本页 Pike VM 正是 NFA 模拟,可与 有限自动机系列的 Thompson 构造 / 子集构造对照。