したがって、正規表現ビルダー(Mx re-builder)を使用して、\で終わる行を見つけるには「\\ $」を使用しますが、検索および正規表現で置換する場合は「\ $」のみを使用します。正規表現ビルダーが直接使用可能な式を構築することを期待していましたが、この違いを説明するものは何ですか?
reb-query-replace
関数定義を見てください。
したがって、正規表現ビルダー(Mx re-builder)を使用して、\で終わる行を見つけるには「\\ $」を使用しますが、検索および正規表現で置換する場合は「\ $」のみを使用します。正規表現ビルダーが直接使用可能な式を構築することを期待していましたが、この違いを説明するものは何ですか?
reb-query-replace
関数定義を見てください。
回答:
実際には4つの異なるre-builder
構文オプションがあり、それらを切り替えることができますC-cTAB
二つは、S式形式の正規表現コンパイラのためのものであるrx
とsregex
(ただし、前者はより包括的で、ほぼ完全な構文と互換性のあるとして、あなたがそれを使用し、古いコードで作業することが起こる場合を除き、あなたは本当にsregexを無視することができます)。
他の2つの構文オプションはread
(デフォルト)とstring
(対話的に使用する構文)です。
read
Lispリーダによって認識される-すなわち-構文は、「コード」構文であるあなたは、あたりとして正規表現を入力する文字列の読み取り構文:
C-hig (elisp) Syntax for Strings
RET
string
(私はいつもこのコンテキストでは、不必要に混乱名前を考えられてきた)構文は、正規表現文字列の構文で、既に読み込まれている、そしてそのため、ときに必要なエスケープ文字のいずれかがない書き込みの文字列を。つまり、これは実際の正規表現構文であり、Emacsが対話形式でプロンプトを表示するときに使用するのと同じです。
デフォルトで文字列構文を使用する場合は、initファイルに次を追加するか、 M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
正規表現を編集するときに、データを失うことなく読み取り構文と文字列構文を切り替えることができることに注意してください。また、切り替えることができますから /読み取りにS式フォーム文字列構文を(当然、文字列にsexpsをコンパイルすると、それらのライブラリがためているものです)、しかし、あなたは他の方向に行くと、文字列からS式を生成することはできません。リビルダはsexpが何であったかを覚えているので、構文を変更してもその形式を失うことはありません。ただし、別の構文で正規表現を変更してから元に戻す場合も更新されません。要するに、正規表現をsexpとして構築している場合、その構文を使用している間のみ編集するようにしてください。
rx
サポートの落とし穴は、実際にrx-to-string
関数を使用していることです。これはrx
、コードでマクロを使用することとはまったく同じではありません。 rx
フォーム引数ととして扱い、それらを任意の数の受け入れ暗黙配列に対し、rx-to-string
単一のフォームを受け付け、任意のトップレベルの配列が有する明示しなければならない'(sequence ...)
、または同等。
フォームを入力するとき要するに、'(...)
再ビルダーでは、それは次のように処理されません(rx-to-string '(...))
(rx ...)
また、無効なフォームはre-builder
、フォームが再び有効になった後でも、関連付けられたバッファー内の一致の動的な更新を停止する可能性があることに注意してください。C-cC-u結合のためにはreb-force-update
、これらの状況を解決するのに便利です。
デフォルトでは、モード行ショー「RE・ビルダー」を使用するread
か、string
構文、および「REビルダーLispの」使用rx
またはsregex
構文が、それははるかに便利識別するためと思われる特定の使用中の構文は(特に区別することread
としますstring
)。
delight
GNU ELPAからパッケージをインストールする場合、次を使用して構文インジケーターをモードラインに追加できます。
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
これにより、read
構文ではモード名が「Regexp [read]」に変更され、他のモード名も同様に変更されます。
または、上記のrx
vs rx-to-string
gotchaのヒントを含めるには、rx
構文を使用するときにモード行に「Regexp [rx-to-string]」と言うようにします。
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))