恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

Vimの正規表現メモ

Vim正規表現が良く分からなかったので、必要になったものを少し調べてみました。

目次


最短一致でマッチ

最短一致に使う正規表現をネット検索したら以下のものがありました。

Vimの正規表現における最短一致     \{-}


sakana inu sakana kuma sakana

という3つのsakanaを含むテキストを使って実験してみました。

上記テキストのうち2つ目のsakanaまでをマッチさせたい場合は次のようにします。

sakana.\{-}sakana


こうすると最短一致となり、

sakana inu sakana

にマッチします。

ちなみに、Vim以外では *? を最短一致に使います。これを鬼車で試したところ、次の書き方で最短一致ができました。

sakana.*?sakana     


失敗例も書いておきます。

sakana.*sakana

この書き方だと最長一致になるので

sakana inu sakana kuma sakana

という風に3つ目のsakanaまで含まれてしまいます。

ダブルクォーテーションの内側だけにマッチ

ダブルクォーテーションの中にあるテキストだけをマッチさせる場合(ダブルクォーテーションは含まない)、次のようにします。

"\@<=..*"\@=


ダブルクォーテーションも含める場合は、上の例から先読みと後読みに関する部分を除去するだけです。

"..*"


行をまたいでマッチ(複数行マッチ)

""
aaaaaaaaaaaaaa
bbbbbbbbbb
ccccccccccccccccc
""
ddddd
""

というテキストがあったとして、1行目の""から5行目の""までを最短一致でマッチさせるなら

""\_.\{-}""

とします。最短一致なので、dddd以下はマッチしません。

空行にマッチ

空行をマッチさせるのにどうやるのか少し悩みましたが、^$ であっさりとマッチしました。if文で使うとしたら

let line_content = getline(line('.'))               " 現在行の内容をline_contentに代入
if line_content =~ '^$' || line_content =~ '^  *'   " 空行 OR 半角spaceのみ
    echo '空行 or 半角spaceのみ'
endif

という感じです。

ファイル末尾にマッチ

ファイル末尾(EOF)は

\%$

で表現できます。

参考にしたサイト

https://qiita.com/kawaz/items/d0708a4ab08e572f38f3