Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

vim正規表現リファレンス

$
0
0

このエントリの内容は 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*\)\@>baaabにマッチするが、\(a*\)\@>abaaabに決してマッチしない。なぜなら \(a*)\@>が先に aaaまで取ってしまいバックトラックもしないので次の文字は bとなり、後が abになることはないため。

グルーピング系

  • (foo|bar)は単に (foo|bar)という文字列にマッチする。
  • \(foo\|bar\)foobarにマッチする。部分正規表現に一致した文字列は、\1\2で後方参照できる。
  • \%(foo\|bar\)foobarにマッチする。\(foo\|bar\)と基本的に同じだが後方参照を作らないので。その分高速。(『pregの(?:foo|bar)』と同じ)
  • \%z(foo\|bar\)foobarにマッチする。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ではマッチしないが \Zcatcat\Zとするとマッチできる。
    • \%Cは直前のパターンについてのみ合成文字を無視する。
      • aà aa ààという文字列に対して、aa\%Caà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...

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>