Next: , Previous: , Up: 正規表現   [Contents][Index]


35.3.3 rx構造化Rgexp表記

文字ベースの構文にたいする代替えとして、EmacsはLispのS式にもとづく構造化されたrx表記を提供します。この表記により通常はregexp文字列をより簡単に読解、記述、保守することができ、自由にインデントしてコメントを記述できます。regexp関数が期待するのは文字列形式なので変換が必要になりますが、この変換はregexpを使用するLispコードの実行時ではなく、通常はバイトコンパイルの間に行われます。

以下はCプログラム言語のブロックコメントにマッチするrxのregexpです22

(rx "/*"                          ; 始まりの/*
    (zero-or-more
     (or (not (any "*"))          ;  非*
         (seq "*"                 ;  または
              (not (any "/")))))  ;  /が後置されていない*
    (one-or-more "*")             ; 少なくとも1つの*
    "/")                          ; と終わりの/

短いシノニムを使用してより簡潔に記述すると、

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

従来の文字列構文では以下のような記述になります

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

rx表記は主にLispコード内で有用です。query-replace-regexpの実行時や変数のカスタマイゼーションのように、regexpが要求されるインタラクティブな状況下では使用することができません。


Footnotes

(22)

これは非欲張りな演算子でもっと簡単に記述できるかもしれませんが(どうやって?)、例が面白くなくなるでしょう。