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 或变量自定义时。