M-x replace-string コマンドは、単一の文字列に対する完全一致を置換します。類似のコマンドである M-x replace-regexp は、指定した正規表現パターンに一致するあらゆる箇所を置換します(正規表現の構文を参照)。
regexp のすべての出現箇所を newstring に置換してください。
replace-regexp において、newstring は定数である必要はありません。regexp
でマッチした部分の全部または一部を参照できます。newstring 内の ‘\&’ は、置換対象となるマッチ全体を表します。newstring 内の ‘\d’(ここで d は 1
から始まる数字)は、regexp の d
番目の括弧で囲まれたグループにマッチしたものを表します。(これは「後方参照」と呼ばれます。)‘\#’ は、このコマンドで既に行われた置換回数を10進数で表します。1回目の置換では
‘\#’ は ‘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式を使用して、置換文字列の一部を計算できます。これを行うには、置換文字列内で ‘\,’ と記述し、その後に式を続けます。各置換処理では、式の値を計算してクォートなしでテキストに変換し(文字列の場合はその内容を使用します)、式そのものの代わりに置換文字列内でその値を使用します。式がシンボルの場合、置換文字列内のシンボル名の後のスペース1つがシンボル名に付随するため、その値が両方を置き換えます。
このような式の中では、いくつかの特殊なシーケンスを使用できます。‘\&’および‘\d’は、ここでも通常通り、マッチ全体を文字列として、またサブマッチを文字列として参照します。‘d’は複数の桁数になる場合があり、‘d’番目の括弧で囲まれたグループがマッチしなかった場合、‘\d’の値はnilとなります。また、‘\#&’および‘\#d’を使用して、それらのマッチを数値として参照することもできます(これは、マッチまたはサブマッチが数値の形式である場合に有効です)。ここでの‘\#’も、すでに完了した置換の回数を表します。
例えば、‘x’と‘y’を次のように入れ替えることができます。
M-x replace-regexp RET \(x\)\|y RET \,(if \1 "y" "x") RET
‘\,’ の置換文字列を計算する場合、format 関数が有用なことが多いです(The Emacs Lisp
Reference Manual の Formatting
Strings を参照してください)。例えば、73列目から80列目まで(すでに使用されている場合を除く)に、‘ABC00042’ のように連番の文字列を追加するには、以下を使用できます。
M-x replace-regexp RET ^.\{0,72\}$ RET
\,(format "%-72sABC%05d" \& \#) RET