このエントリの内容は 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\{n,m}
はn
回以上m
回以下のa
の繰り返しにマッチする。(最長マッチ)a\{,m}
は0
回以上m
回以下のa
の繰り返しにマッチする。(最長マッチ)a\{,}
は0
回以上a
の繰り返しにマッチする。(最長マッチ、a*
と同じ)
a\{-n,m}
系(a\{n,m}
と基本同じだがブレス内の頭に-
をつけることで最短一致になる)a\{-n}
は丁度n
回のa
の繰り返しにマッチする。(-
のアリナシで意味に違いはない)a\{-n,}
はn
回以上のa
の繰り返しにマッチする。(最短マッチ、『pregのa{n,}?
と同じ』))a\{-n,m}
はn
回以上m
回以下のa
の繰り返しにマッチする。(最短マッチ、『pregのa{n,m}?
と同じ』)a\{-,m}
は0
回以上m
回以下のa
の繰り返しにマッチする。(最短マッチ、『pregのa{,m}?
と同じ』)a\{-,}
は0
回以上a
の繰り返しにマッチする。(最短マッチ、『pregのa*?
』と同じ)a\{-,1}
は0か1個の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
にマッチするが `variableP にはマッチしない。\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...