2020-02-07

tobijibu

正規表現置換のデリミタについて

Vimでは:%s/検索文字列/置換文字列/という方法で文字列を置換することができます。 置換は:%s///のように/を使うのが一般的ですが、/でなくても検索置換することができます。

:%s@@@:%s&&&:%s%%%と指定することもできます。

:%s@foo@bar@
:%s&foo&bar&
:%s%foo%bar%
:%s:foo:bar:

試したところキーボードから入力可能な半角記号は全て使えるようです。 英数字、全角文字、全角記号等は使えません。 ^T(Ctrl+t)(=tab文字)等も試しましたがダメでした。

ただし検索対象になる文字や置換対象になる文字にその記号が含まれていないことが条件です。 含まれている場合は\でエスケープする必要があります。


正規表現のデリミタはVimに限らず他の言語でも同じように指定することができます。 PerlやPHP等で正規表現を使う場合、[...](...)のような書き方も使えるようです。 以下はどちらも同じ結果になります。

preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

preg_match('[(foo)(bar)(baz)]', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

preg_match('(\(foo\)\(bar\)\(baz\))', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

この仕組みを知っているとURL等の/が含まれた文字列を検索置換したい場合に/をいちいちエスケープする必要がなくなるので便利かもしれませんね。