正则语法速览:一处试通各种写法
本系列前半讲的是 Unicode 与 emoji,这页回到正则语法本身:字面量、字符类、量词、分组、锚点、反向引用、断言、标志位。这些写法本仓库的 @vega/parsing/regex 引擎基本都支持,页面里的匹配器直接跑它,而不是浏览器的原生 RegExp。
1 · 实时匹配器
匹配器给出命中高亮、捕获组、命名组与 indices,并标出这条 pattern 走了哪条引擎。能用线性的 Pike VM 就用它,遇到反向引用或 lookaround 才切到回溯引擎。
2 · 编译成状态机
换个视角看同一条 pattern:正则先经 Thompson 构造成 NFA,再经子集构造成 DFA,最后最小化,三台机器认同一门语言。图 2-1 拿自研引擎的 AST 现场编译,边上标的是字符集与区间,所以 [a-z]、\d、.、{n,m} 与 Unicode 属性都画得出来。
碰到反向引用、lookaround 或原子组会明确提示「超出有限状态机」——它们本就不属于正则语言,这正是引擎遇到它们要回溯的原因;词边界与行锚点这类带位置的断言同样不画。
3 · 分类例子
九类写法各配几个例子,选中即装进上面两个 lab。
注 · 带反向引用或 lookaround 的例子会让引擎自动从 Pike VM 切到回溯,结果栏里能看到走的是哪条。字符串值属性 \p{RGI_Emoji} 这类多码点序列本引擎不支持,那是 RGI 序列 用原生 v 模式处理的内容。引擎内部的 AST 与字节码见
自研引擎。
4 · 参考文献
- Ecma International. ECMA-262: RegExp. JS 正则的语法与语义定义,各标志位的行为出处。tc39.es
- MDN. 正则表达式. 语法速查与各类断言、分组、标志位的用法说明。developer.mozilla.org
- Russ Cox. Regular Expression Matching Can Be Simple And Fast. Thompson 构造与线性时间匹配的经典论述,Pike VM 一脉的源头。swtch.com
- regex101. 在线测试器. 逐 token 解释、替换预览与调试器,可切多种 flavor 对照。regex101.com