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