24

私は emacs lisp をいじっていて、正規表現の検索と置換を行う小さな関数を書きたいと思っていました。Lispコードを書くときにすべての特殊文字をダブルエスケープする必要があることに気づいていなかったので、正規表現を正しく機能させるのにかなりの時間を費やしました(ただし、query-replace-regexpをインタラクティブに使用するときはそうではありません!)。

たとえば、 query-replace-regexp をインタラクティブに使用すると、

^\(.*\)[\t]-.*$

しかし、elispコードを書くときは、次のようにすべてをダブルエスケープする必要があります:

^\\(.*\\)[\t]-.*$  

Steve Yegge の記事でこれへの言及をようやく見つけましたが、これがなぜなのか知っている人がいるのだろうかと思っていました。

4

4 に答える 4

18

あなたはすでに答えを持っていますが、Emacs内で正規表現を作成するための組み込みの補佐官は再構築者です。

M-x re-builder
于 2009-02-11T22:35:47.997 に答える
10

scottfrazierは正しいです。文字列が読み取られるときに1つのエスケープが解析され、正規表現を作成するときに別のエスケープが解析されます。覚えるのはかなり簡単ですが、特に文字通りの円記号'\'を一致させようとしている場合は、苦痛になる可能性があります。最初の文字列解析と正規表現解析の両方でスラッシュを一致させるためにダブルスラッシュを使用する必要があるため、「\\\\」を4回実行する必要があります。

また、この問題についてStack Overflowに書き込む場合、マークダウンはエスケープ文字にもスラッシュを使用するため、8つのスラッシュを使用する必要があります。

于 2009-02-11T21:47:32.603 に答える
8

FWIWはemacs-lisp-mode、特別な表現をフォント化します( あなたのために\\(そして\\)あなたのために。その後、顔を目立つものに変更できます.

(彼らはfont-lock-regexp-grouping-constructfont-lock-regexp-grouping-backslash)

于 2009-02-11T23:24:43.807 に答える