GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Rx-Notation.html ・ emacs-doc.conao3.com

35.3.3 rx 構造化正規表現表記法

文字列ベースの構文に代わるものとして、EmacsではLispのS式に基づいた構造化表記法 rx が提供されています。この表記法は通常、正規表現文字列よりも読み書きや保守が容易であり、自由にインデントやコメントを付けることができます。正規表現関数が想定しているのは文字列形式であるため、文字列への変換が必要になりますが、この変換は通常、正規表現を使用するLispコードの実行時ではなく、バイトコンパイル時に行われます。

以下は、C言語のブロックコメントにマッチするrx正規表現30です。

(rx "/*"                            ; Initial /*
    (zero-or-more
     (or (not "*")                  ;  Either non-*,
         (seq (one-or-more "*")     ;  or some * followed by
              (not (or "*" "/"))))) ;     neither * nor /
    (one-or-more "*")               ; At least one star,
    "/")                            ; and the final /

あるいは、より短い類義語を用い、より簡潔に記述すれば、

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

従来の文字列構文では、次のように記述されます。

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

rx という表記は主に Lisp コードで有用であり、query-replace-regexp の実行時や変数のカスタマイズなど、正規表現が求められるほとんどの対話的な場面では使用できません。


脚注

(30)

非貪欲演算子を使えばずっとシンプルに書けますが(どうやって?)、そうすると例としての面白みが薄れてしまいます。