Vim – 正規表現の置換で特殊文字をエスケープする方法【必要な文字も】

midSun31midSun31
IT・デジタル

Vimで「/」や「^」などの文字を正規表現で置換しようと思ってうまくいできないケースがあると思います。これらの特殊文字(メタ文字)は通常の構文で入力しても置換ができません。

この記事では、Vimエディタで特殊文字を置換するためにエスケープする方法をご紹介します。Vimエディタのバージョンは8.1を利用しています。

特殊文字が置換できないケース

Vimでは、特殊文字を正規表現に含めるとうまく置換ができません。

以下の例では「$」記号を文字列「something」に変更するため、置換前の文字列にとして「$」と入力しました。

結果として、「$」記号は置換されずに予想外の箇所に文字列「something」が入ってしまいます。

上記のような結果になる理由としては、正規表現で「$」が行末を意味する特殊文字として扱われてしまうためです。

正規表現で別の意味をもつ文字は特殊文字やメタ文字と呼ばれ、その文字自体を置換したい場合はエスケープが必要です。

特殊文字をエスケープして置換する方法

正規表現で特殊文字を通常の文字として認識させるためには「\」を用いてエスケープする必要があります。

具体的には、「$」を文字として認識させるためには「$」の直前に「\」を入れてエスケープします。

:%s/\$/something

上記のように置換前の文字列に「\$」を設定することで、「$」の文字を「something」に置換することができます。

コマンドの実行結果は次のとおりです。

正しく「$」の文字を置換することができました。

置換先を確認してから置換する方法

特殊文字が含まれる場合、置換の検索対象が正しいか事前に確認しておくと誤った置換をしてしまうのを防ぐことができます。

事前に検索対象を確認してから置換したい場合は、次のように一度検索がヒットすることを確認して下さい。

/置換前文字列

検索した後、次のように置換前文字列を省略して置換コマンドを実行すると、直前の検索結果に対して置換することができます。

%s//置換後文字列/

エスケープが必要な特殊文字

Vimの正規表現でエスケープが必要な特殊文字の一覧は次の通りです。(デフォルトのmagicオプションの場合)

^ $ . * [ ] / ~ \

基本的に、正規表現で利用するメタ文字を単独で置換したい場合にエスケープが必要になります。

ただし、特殊文字以外の文字とセットで使う場合はエスケープは必要ありません。(「/」は常にエスケープが必要です。)

特殊文字を複数使う場合

特殊文字を連続で使用する場合は、それぞれ「\」でエスケープする必要があります。異なる特殊文字が連続している場合も同様です。

「/」2つと「add」を置換したい場合、一つだけエスケープしても正しくヒットしないので注意して下さい。

  • 誤った例:
    /\/*
  • 正しい例:
    /\/\*

以上、Vimエディタの置換で特殊文字をエスケープする方法でした。

IT・デジタル
Howpon[ハウポン]

コメント