このエントリの内容は pattern - Vim日本語ドキュメント を見れば全て書いてある。
個人的によく見直すものを自分なりに整理してまとめなおしたものです。
メモ
vimの正規表現には \ でエスケープする必要な文字がオプションによって変わる。これには magic / nomagic / very magic / very nomagic と4つのモードがあるけど、vim では magic モードを基本とします。
繰返し制御系(量指定子)
-
a*は0回以上のaの繰り返しにマッチする。(最長一致) -
a+は単にa+という文字列にマッチする。 -
a\+は1回以上のaの繰り返しにマッチする。(最長一致) -
a?は単にa?という文字列にマッチする。 -
a\?は0または1個のaにマッチする。 -
a\=は0または1個のaにマッチする。(\?と基本同じだが\?は後方検索で使えない) -
a\{n,m}系(『pregのa{n,m}系』と基本同じ、どれも最長一致)-
a\{n}は丁度n回のaの繰り返しにマッチする。 -
a\{n,}はn回以上のaの繰り返しにマッチする。(最長マッチ) -
a\{1,}は1回以上aの繰り返しにマッチする。(最長マッチ、a\+と同じ) -
a\{n,m}はn回以上m回以下のaの繰り返しにマッチする。(最長マッチ) -
a\{,m}は0回以上m回以下のaの繰り返しにマッチする。(最長マッチ) -
a\{,}は0回以上aの繰り返しにマッチする。(最長マッチ、a*と同じ) -
a\{}は0回以上aの繰り返しにマッチする。(最長マッチ、a*と同じ)
-
-
a\{-n,m}系(a\{n,m}と基本同じだがブレス内の頭に-をつけることで最短一致になる)-
a\{-n}は丁度n回のaの繰り返しにマッチする。(-のアリナシで意味に違いはない) -
a\{-n,}はn回以上のaの繰り返しにマッチする。(最短マッチ、『pregのa{n,}?と同じ』)) -
a\{-1,}は1回以上aの繰り返しにマッチする。(最短マッチ、『pregのa+?』と同じ) -
a\{-n,m}はn回以上m回以下のaの繰り返しにマッチする。(最短マッチ、『pregのa{n,m}?と同じ』) -
a\{-,m}は0回以上m回以下のaの繰り返しにマッチする。(最短マッチ、『pregのa{,m}?と同じ』) -
a\{-,1}は0か1個のaにマッチする。(最短マッチ、『pregのa??』と同じ) -
a\{-,}は0回以上aの繰り返しにマッチする。(最短マッチ、『pregのa*?』と同じ) -
a\{-}は0回以上aの繰り返しにマッチする。(最短マッチ、『pregのa*?』と同じ)
-
-
\@>…強欲な量指定子。直前のパターンが強欲にマッチするようになる。(『(Perlの(?>pattern)と似ている)-
\(a*\)\@>bはaaabにマッチするが、\(a*\)\@>abはaaabに決してマッチしない。なぜなら\(a*)\@>が先にaaaまで取ってしまいバックトラックもしないので次の文字はbとなり、後がabになることはないため。
-
グルーピング系
-
(foo|bar)は単に(foo|bar)という文字列にマッチする。 -
\(foo\|bar\)はfooかbarにマッチする。部分正規表現に一致した文字列は、\1や\2で後方参照できる。 -
\%(foo\|bar\)はfooかbarにマッチする。\(foo\|bar\)と基本的に同じだが後方参照を作らないので。その分高速。(『pregの(?:foo|bar)』と同じ) -
\z(foo\|bar\)はfooかbarにマッチする。__syntaxコマンドのstart=オプションの中でのみ使用可能__で、部分正規表現に一致した文字列は同コマンドのend=オプションの中で\z1や\z2で参照できる。 -
a\%[bcd]はa/ab/abc/abcdにマッチする。adにはマッチしない。(Perlのa(b(cd?)?)?みたいなイメージ)
文字エスケープ
-
\eは<Esc>にマッチする。 -
\tは<Tab>にマッチする。 -
\rは<CR>にマッチする。 -
\bは<BS>にマッチする。 -
\nは 改行文字にマッチする。
文字クラス系
-
[a-z]はa,b,c,...,zの文字にマッチする。pregと同じ。 -
[^a-z]はa,b,c,...,z以外の文字にマッチする。pregと同じ。 -
.は改行以外のすべての文字にマッチする。 -
\sは改行以外の空白文字にマッチする。 -
\dは[0-9]と同じ。(10進数に使われる文字) -
\xは[0-9A-Fa-f]と同じ。(16進数に使われる文字) -
\oは[0-7]と同じ。(8進数に使われる文字) -
\wは[0-9A-Za-z_]と同じ。(単語に使われる文字) -
\hは[A-Za-z_]と同じ。(\wから数字を除いたもの、単語の先頭文字) -
\aは[A-Za-z]と同じ。(英字) -
\lは[a-z]と同じ。(英字の小文字) -
\uは[A-Z]と同じ。(英字の大文字) -
\S,\D,\X,\O,\W,\H,\A,\L,\Uはそれぞれ、空白以外の文字、数字以外の文字、…にマッチする。 -
\_+↑で改行を含む文字にマッチする。-
\_.は改行を含むすべての文字にマッチする。(Perlのs修飾子を付けた状態みたいな感じ) -
\_sは改行を含む空白文字にマッチする。 -
\_d,\_x,\_o,\_w,\_h,\_a,\_l,\_u,\_S,\_D,\_X,\_O,\_W,\_H,\_A,\_L,\_Uとかも同様。 -
\_[a-z]は『[a-z]と改行文字』にマッチする。
-
-
\%d123は10進数で指定した文字にマッチする。(最大値=255) -
\%o40は8進数で指定した文字にマッチする。(最大値=377=255) -
\%x2aは16進数で指定した文字にマッチします。(最大値=ff=255) -
\%u20ACは16進数で指定した文字にマッチする。(4桁まで) -
\%U1234abcdは16進数で指定した文字にマッチします。(8桁まで) -
[:alnum:],[:alpha:],[:blank:],[:cntrl:],[:digit:],[:graph:],[:lower:],[:print:],[:punct:],[:space:],[:upper:],[:xdigit:],[:return:],[:tab:],[:escape:],[:backspace:]という文字クラスもある。
位置指定系
位置し定形は全て幅ゼロでマッチします。
-
^と$はvimでは常に各々行頭と行末にマッチする。 -
\%^と\%$はテキストの先頭と末尾にマッチする。(Perlのm修飾子を付けた状態みたいな感じ) -
\<と\>はワードの直前と直後にマッチする。\<var\>はvar hoge=1にマッチするがvariableにはマッチしない。 -
\zsはマッチの開始地点を設定する。これより前は幅ゼロ扱いでマッチに含まない。後読みの代わりに使える。複数マッチした場合は一番最後が有効。 -
\zeはマッチの終了地点を設定する。これより後は幅ゼロ扱いでマッチに含まない。先読みの代わりに使える。複数マッチした場合は一番最後が有効。
位置指定系(vimの状態や座標に関係するもの)
-
\%Vはビジュアルモードの範囲内にマッチする。\%Vfoo\%Vは選択範囲内のfooにマッチする。\%Vでマッチの前後を挟むのが基本的な使い方になる。 -
\%#はカーソル位置にマッチする。\k\%#\kはカーソル位置の単語、\s*\%#\s*はカーソル位置の空白文字の連続にマッチする。 -
\%'m、\%<'m、\%>'mはそれぞれ、『マークm』の位置、『マークm』の前、『マークm』の後にマッチする。 -
\%23、\%<23、\%>23はそれぞれ、23行目の行、23行目より上の行、23行目より下の行にマッチする。 -
\%23c、\%<23c、\%>23cはそれぞれ、23列目、23列目より前の列、23列目より後の列にマッチする。 -
\%23v、\%<23v、\%>23vはそれぞれ、23列目の表示列、23列目の表示列より前の列、23列目の表示列より後の列にマッチする。
先読み、後読み
-
\@=…肯定先読み。foo\%(bar\)\@=は直後にbarがあるfooにマッチする、bar部分はゼロ幅扱いでマッチに含まない。(『Perlの(?=bar)』と同じ)-
foo\%(bar\)\@=は\zeを使って、foo\zebarと書くことも出来る。
-
-
\@!…否定先読み。foo\%(bar\)\@!は直後にbarがないfooにマッチする。(『Perlの(?!bar)』と同じ)- 否定先読みは高コストなので出来るだけ使わないほうが良い。
-
\@<=…肯定後読み。\%(foo\)\@<=barは直前にfooがあるbarにマッチする、foo部分はゼロ幅扱いでマッチに含まれない。(『Perlの(?<=pattern)』と基本同じだが、vimでは量指定子も使える)-
\@123<=とすると\@<=と基本同じだが、パフォーマンスのために遡ってチェックするバイト数を制限できる。 -
\%(foo\)\@<barは\zsを使ってfoo\zsbarと書くことも出来る。 - 否定後読みの対象パターンが後方参照を作るとき、正規表現エンジンのバージョンによってその挙動に違いが出ることがあるらしくポータビリティを考えると
\zsを使って書いたほうが良いらしい。
-
-
\@<!…否定後読み。\%(foo\)\@<!barは直前にfooがないbarにマッチする。(『Perlの(?<!pattern)』と基本同じだが、vimでは量指定子も使える)-
\@123<!とすると\@<!と基本同じだが、パフォーマンスのために遡ってチェックするバイト数を制限できる。否定後読みは高コストなので出来るだけ範囲制限をかけるようにした方が良い。
-
心の声: vim の先読み後読みの
\@XX系パターンは記号自体がゴツいのとpregと違って記号を後置するのが慣れないので、\zsと\zeで代替出来るケースでは後者を使う方が個人的には好みです。ただ、他人の書いたコードを読むと\@XXも結構出てくるので読めないと困るのでその確認用にまとめ直しはじめたのがこのエントリです。
修飾子みたいなやつ
-
\cをパターンに含めるとパターン全体で大文字と小文字の違いが無視されるようになる。但し\wとかの文字クラスには影響しない。 -
\Cをパターンに含めるとパターン全体で大文字と小文字の違いが区別されるようになる。但し\wとかの文字クラスには影響しない。 -
\m,\M,\v,\Vはそれ以降パターンをmagic,nomagic,very magic,very nomagic状態にする。 -
合成文字関連(詳細は各自でドキュメント確認して…)
-
\Zをパターンに含めるとパターン全体で合成文字が無視される。-
càtという文字列に対して、catではマッチしないが\Zcatやcat\Zとするとマッチできる。
-
-
\%Cは直前のパターンについてのみ合成文字を無視する。-
aà aa ààという文字列に対して、aa\%Cはaàやaaの部分にはマッチするがààにはマッチしない。
-
-
その他
-
~は最後に置換された文字列にマッチする。
VimとPerlの簡易比較表
Perl のパターンとの比較より(一部追記)
効果 Vim の表記 Perl の表記
----------------------------------------------------------------
大文字と小文字を区別しない \c (?i)
大文字と小文字を区別する \C (?-i)
後方参照しないグループ \%(atom\) (?:atom)
最短一致の量指定子 \{-n,m} *?, +?, ??, {}?
幅ゼロの肯定先読み atom\@= (?=atom)
幅ゼロの否定先読み atom\@! (?!atom)
幅ゼロの肯定後読み atom\@<= (?<=atom)
幅ゼロの否定後読み atom\@<! (?<!atom)
強欲な量指定子 atom\@> (?>atom)
後方参照 \1, \2, \3... $1, $2, $3...