vim-users.jp

Hack #55: 正規表現のメタ文字の扱いを制御する

Posted at 2009/08/11
このエントリーをはてなブックマークに追加

Vim では随所で強力な正規表現を利用することができます。Vim は正規表現のメタ文字に関して少々特殊な機構を持っています。 本 hack では正規表現で重要なメタ文字の Vim 上での扱いについて見ていきます。

メタ文字

正規表現にはメタ文字と言うものがあり、これらの文字は正規表現中で特別な意味を持ちます。 しかし、メタ文字をリテラルとして使用したい場合いちいちエスケープする必要があり面倒です。 そのために、Vim の正規表現には magic、very magic と言う概念があります。

magic と very magic

Vim の正規表現にはメタ文字の処理に関して 4 つの状態があり、状態によってどの文字がメタ文字であるかが変わります。

  • very magic
  • magic
  • nomagic
  • very nomagic

下に行くほど記号はリテラル文字として扱われます。very magic は全ての記号はメタ文字として扱われ、 very nomagic はバックスラッシュ以外の記号は全てリテラル文字として扱われます。 magic と nomagic はどの文字がメタ文字として扱われるかはまちまちです。help で確認してください。

リテラル文字として扱われる文字もバックスラッシュを前置することでメタ文字として扱えます。 例えば . (任意の1字を表すメタ文字) は nomagic の際はリテラル文字ですが、\. とすることでメタ文字として扱えます。

状態の切り替え

それぞれの状態は正規表現中に \v \m \M \V を置くことで切り替えます。これは書かれた箇所以降で有効になります。 つまり、1 つの正規表現中で途中で状態を変更することができます。

これは逆に言うと、複数の任意の正規表現を文字列として結合した場合、以前がどの状態になっているかわからないことを意味します。 正規表現を結合するような処理を行う場合、各正規表現の先頭で状態を設定しておいた方が良いでしょう。

magic のデフォルト値

magic の初期値は 'magic' オプションで決まります。boolean 型のオプションで、on だと magic、off だと nomagic になります。 オプション自体のデフォルト値は on です。

ただし、:syntax に指定するパターンや =~ によるマッチング時など一部の場合は ポータビリティを高めるために 'magic' は常に on に設定されます。

残念なことに、'verymagic' のようなオプションはありません。普段から使いたい場合は、少々強引ですが以下のような Key mapping を使用する方法があります。

nnoremap / /\v
thinca

もどる
blog comments powered by Disqus