算法与数据结构 / regex · Unicode 字符模型与一个自研引擎 / 正则语法速览:一处试通各种写法 待审核 28 / 36
syntax · 各种语法一处试

正则语法速览:一处试通各种写法

本系列前半讲的是 Unicode 与 emoji,这页回到正则语法本身:字面量、字符类、量词、分组、锚点、反向引用、断言、标志位。这些写法本仓库的 @vega/parsing/regex 引擎基本都支持,页面里的匹配器直接跑它,而不是浏览器的原生 RegExp

1 · 实时匹配器

匹配器给出命中高亮、捕获组、命名组与 indices,并标出这条 pattern 走了哪条引擎。能用线性的 Pike VM 就用它,遇到反向引用或 lookaround 才切到回溯引擎。

图 1-1 · 一条 pattern 在一段文本上的实时匹配:命中高亮、首个匹配的分组与位置,以及实际走的引擎。可改 pattern、flags 与输入。

2 · 编译成状态机

换个视角看同一条 pattern:正则先经 Thompson 构造成 NFA,再经子集构造成 DFA,最后最小化,三台机器认同一门语言。图 2-1 拿自研引擎的 AST 现场编译,边上标的是字符集与区间,所以 [a-z]\d.{n,m} 与 Unicode 属性都画得出来。

碰到反向引用、lookaround 或原子组会明确提示「超出有限状态机」——它们本就不属于正则语言,这正是引擎遇到它们要回溯的原因;词边界与行锚点这类带位置的断言同样不画。

图 2-1 · 图 1-1 那条 pattern 的三台状态机,以及试串在最小化 DFA 上走过的路径。可改试串,或换上面的 pattern。

3 · 分类例子

九类写法各配几个例子,选中即装进上面两个 lab。

图 3-1 · 按语法类别分组的例子清单,点任一例即写进图 1-1 与图 2-1。

注 · 带反向引用或 lookaround 的例子会让引擎自动从 Pike VM 切到回溯,结果栏里能看到走的是哪条。字符串值属性 \p{RGI_Emoji} 这类多码点序列本引擎不支持,那是 RGI 序列 用原生 v 模式处理的内容。引擎内部的 AST 与字节码见 自研引擎

4 · 参考文献

  1. Ecma International. ECMA-262: RegExp. JS 正则的语法与语义定义,各标志位的行为出处。tc39.es
  2. MDN. 正则表达式. 语法速查与各类断言、分组、标志位的用法说明。developer.mozilla.org
  3. Russ Cox. Regular Expression Matching Can Be Simple And Fast. Thompson 构造与线性时间匹配的经典论述,Pike VM 一脉的源头。swtch.com
  4. regex101. 在线测试器. 逐 token 解释、替换预览与调试器,可切多种 flavor 对照。regex101.com