5

以下に示すバッファー内の引用テキストのすべてのインスタンスを非引用バージョンに置き換えるために、replace-regexp を対話的に使用することに成功しました。私が検索した正規表現は

\"\([^\"]*\)\" 

挿入した NEWTEXT は \1 でした。

* "PROJECT START"
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: "0 days"
:TYPE: "Fixed Work"
:OUTLINE_LEVEL: 1
:END:

インタラクティブに、上のテキストが下のテキストに変わりました。

* PROJECT START
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: 0 days
:TYPE: Fixed Work
:OUTLINE_LEVEL: 1
:END:

次の2行を挿入して、これと同じ検索と置換をプログラムで実行しようとしました

(while (re-search-forward "\"\([^\"]*\)\"" nil t)
  (replace-match "\1" nil nil ))

バッファの先頭で実行されましたが、単一の一致が見つからずに単に nil が返されました。

を省略すると

\( \) 

グループ化し、\1 を \& に置き換えます

(while (re-search-forward "\"[^\"]*\"" nil t)
  (replace-match "\&" nil nil ))

引用符で囲まれたすべての文字列が「&」に置き換えられます。

* &
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: &
:TYPE: &
:OUTLINE_LEVEL: 1
:END:

これらの関数の両方のドキュメントで見たものはすべて、これらの関数がこれらの特殊文字を認識する必要があることを示しており、このフォーラムの他の質問への回答での使用例ではこれらの特殊文字が使用されています。

グループ化と \&、\N、\ 文字が正しく解釈されない理由を理解できる人はいますか?

4

1 に答える 1

7

「(」、「)」、および「\1」の「\」をエスケープする必要があります。すなわち:

(while (re-search-forward "\"\\([^\"]*\\)\"" nil t)
  (replace-match "\\1" nil nil ))
于 2012-08-12T16:49:28.970 に答える