regexビルダーで作成された正規表現が、インタラクティブな正規表現とは異なる構文を使用するのはなぜですか?


26

したがって、正規表現ビルダー(Mx re-builder)を使用して、\で終わる行を見つけるには「\\ $」を使用しますが、検索および正規表現で置換する場合は「\ $」のみを使用します。正規表現ビルダーが直接使用可能な式を構築することを期待していましたが、この違いを説明するものは何ですか?


6
コードで直接使用できる式を作成します。
abo-abo 14

1
@ abo-aboそれは私が探していた答えです。コードで使用できるものとUIで使用できるものに違いがあることに気づきませんでした。再構築者がコードの構文を使用し、マニュアルには書かれていないことは直感に反しているようですが、それは違いを説明しています。
user2699 14

2
インタラクティブな検索を作成するために正規表現ビルダーをより便利にするために、ReBuilder emacs wikiページ、特にreb-query-replace関数定義を見てください。
dfeich 14

回答:


29

実際には4つの異なるre-builder構文オプションがあり、それらを切り替えることができますC-cTAB

二つは、S式形式の正規表現コンパイラのためのものであるrxsregex(ただし、前者はより包括的で、ほぼ完全な構文と互換性のあるとして、あなたがそれを使用し、古いコードで作業することが起こる場合を除き、あなたは本当にsregexを無視することができます)。

他の2つの構文オプションはread(デフォルト)とstring(対話的に使用する構文)です。

readLispリーダによって認識される-すなわち-構文は、「コード」構文であるあなたは、あたりとして正規表現を入力する文字列の読み取り構文

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)。

delightGNU ELPAからパッケージをインストールする場合、次を使用して構文インジケーターをモードラインに追加できます。

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

これにより、read構文ではモード名が「Regexp [read]」に変更され、他のモード名も同様に変更されます。

または、上記のrxvs rx-to-stringgotchaのヒントを含めるには、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))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.