35.3.3 rx 结构化正则表达式表示法

作为基于字符串语法的替代方案,Emacs 提供了基于 Lisp S-表达式的结构化 rx 表示法。这种表示法通常比正则表达式字符串更易于阅读、编写和维护,并且可以自由缩进和添加注释。它需要转换为字符串形式才能被正则表达式函数使用,但这种转换通常在字节编译期间完成,而非在运行使用该正则表达式的 Lisp 代码时进行。

下面是一个用于匹配 C 语言块注释的 rx 正则表达式27

(rx "/*"                    ; 起始的 /*
    (zero-or-more
     (or (not "*")          ;  要么是非 * 字符,
         (seq "*"           ;  要么是 * 后接
              (not "/"))))  ;      非 / 字符
    (one-or-more "*")       ; 至少一个星号,
    "/")                    ; 以及最终的 /

或者,使用更短的同义词并以更紧凑的形式书写:

(rx "/*"
    (* (| (not "*")
          (: "*" (not "/"))))
    (+ "*") "/")

在传统的字符串语法中,它会被写作:

"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"

rx 表示法主要用于 Lisp 代码中;在大多数需要输入正则表达式的交互场景下无法使用,例如运行 query-replace-regexp 或变量自定义时。


Footnotes

(27)

使用非贪婪运算符可以写得更简单(如何实现?),但那样会让这个示例失去意义。