Next: , Previous: , Up: Replace   [Contents][Index]


15.10.2 正規表現の置換

M-x replace-stringコマンドは、正確にマッチする単一の文字列を置換します。同様なコマンドM-x replace-regexpは、指定した正規表現パターン(Regexpsを参照してください)にマッチするすべてを置換します。

M-x replace-regexp RET regexp RET newstring RET

regexpにマッチするすべてをnewstringで置換します。

replace-regexpでは、newstringが定数である必要はありません。regexpにマッチした全体、または部分を参照することができます。newstringでの‘\&’は、置換されるマッチ全体を表します。newstringでの‘\d’(dは1から始まる数字)は、regexp内でカッコでグループ化されたものの、d番目にマッチします(これは“後方参照(back reference)と呼ばれます”)。‘\#’は、このコマンドですでに置換された件数を10進数で参照します。最初の置換では‘\#’は‘0’で、2番目の置換では‘1’、...のようになります。たとえば、

M-x replace-regexp RET c[ad]+r RET \&-safe RET

これは‘cadr’を‘cadr-safe’に、‘cddr’を‘cddr-safe’に置き換えます。

M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET

これは逆向きの置換をします。置換するテキストに‘\’を含めるときは、‘\\’と入力しなければなりません。

置換する文字列の一部を毎回手入力したいときは、置換文字列で‘\?’を使用します。すると置換ごとにミニバッファーで置換文字列を編集できます(ポイント位置は‘\?’を記述した場所です。)

このサブセクションの残りの部分は、Lispの知識が必要となる特別な処理を念頭に書かれています。大半の読者はスキップしても構いません。

置換文字列の一部を計算するために、Lisp式を使うことができます。これを行うには、置換文字列の中で、‘\,’に続けてLisp式を記述します。各置換において式の値が計算され、それをクォートされていない文字列に変換します(もし文字列の場合は、その文字列の内容が使われることを意味します)。そしてそれを置換文字列内で、式が記述された場所に使用します。もし式がシンボルのときは、シンボル名と、置換文字列中のシンボル名の後にあるの間に1つスペースは、両方シンボルの値に置換されます。

このような式の中では、いくつかの特別なシーケンスを使うことができます。式の中での‘\&’や‘\d’は、通常のようにマッチした文字列全体と、部分マッチした文字列を参照します。dには複数桁の数字を記述でき、カッコでグループ化されたd番目の正規表現がマッチしなかったとき、‘\d’はnilになります。‘\#&’と‘\#d’を使って、それらのマッチを数字で参照することもできます(これはマッチまたは部分マッチが数字書式の場合に有効です)。ここでの‘\#’も、すでに置換された数を意味します。

x’と‘y’の入れ替えは、以下の方法で行うことができます:

M-x replace-regexp RET \(x\)\|y RET
\,(if \1 "y" "x") RET

\,’により置換する文字列を計算するには、format関数が便利なときがあります(Formatting Strings in The Emacs Lisp Reference Manualを参照してください)。たとえば73列目から80列目(もしそこに何もなければ)に、‘ABC00042’のような連番を振りたいときは、以下を使うことができます。

M-x replace-regexp RET ^.\{0,72\}$ RET
\,(format "%-72sABC%05d" \& \#) RET