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

vimにはマッチするけどemacsにはマッチしないvimmer的正規表現

$
0
0

vimで検索していたA氏はふと考えた。

vimとemacsの論争。
vimはモードの概念がある。
emacsはOSと呼ばれるほど多機能である。

vimは含むけどemacsは含まない行が欲しい!」

つまり、2行目だけを取り出したいとする。
まずは解答。

/\v^(.*vim)@=(.*emacs)@!.*$

前置き

  • vim使いである
  • 基本的な正規表現を知っている
  • vimで検索時に\vを付け、verymagicを有効にする
    • いちいち(などをエスケープするのが大変なため

たとえば、

/\v^a[iue]o$

が何をしているかわかれば大丈夫。

aio
auo
aeo

にマッチします。

以降、/\vは省略。

本題

テストに使う文字列は以下。

mac
tac
cam
miv
emacs
vi
vim
elvim

前にviがあるmにマッチさせる

vim
elvim

mにマッチさせたい場合。

肯定後読みを利用。

(vi)@<=m

これで、手前にviがある場合のみmにマッチする。
()でくくり、次に@<=を付ける。
よく使うパターンだし、長いので、\zsという書き方が用意されている(sstart)。

vi\zsm

前にviがないmにマッチさせる

否定後読みを利用。

mac
tac
cam
miv
emacs

の各mにマッチ。

(vi)@<!m

=!に変えたら否定。

次にmが続くviにマッチさせる

今度はviを抽出したい。

vim
elvim

viにマッチ。
こういうときは肯定先読みを利用。

vi(m)@=

後読みのときの<が消え、マッチング対象の後ろに来た形。
これもよく使うので、

vi\zem

\zeで修飾できる(eend)。

次にmが続かないviにマッチさせる

マッチ対象は以下。

vi

肯定先読みの=!に変えて否定の意味にするだけ。

vi(m)@!

ちゃんとvimelvimは結果から除外されている。

vmを含む行にマッチさせる

ここからが本番。
一般的なweb検索のようにand条件でマッチングさせたい場合。

^(.*v)@=(.*m)@=.*$

ちょっと複雑だけど、肯定先読みがポイント。

最初の^を読み取るとき、その後に「なんちゃらv」「なんちゃらm」が含まれているかどうかをチェック。
条件を満たしていたら.*$の部分にマッチ。

この条件では、

miv
vim
elvim

の行全体にマッチする。
mivmvが逆だが、問題ない。

vmを含む行にマッチさせる

今度はor検索。
andとは違って基本的な正規表現だけで書ける。

^.*(v|m).*$

文字列中にvmがあるかどうかをチェックしているだけ。

mac
cam
miv
emacs
vim
vi
elvim

にマッチする。

なお、vmも1文字なので、文字セットを利用して、

^.*[vm].*$

と書いても同じ。

vmも含まない行にマッチさせる

vmを含む行にマッチさせる」を反転させたもの。

^(.*v)@!(.*m)@!.*$

=!に替わっているだけ。

なお、検索対象が1文字だけなら、文字セットを利用して、

^[^vm]*$

と書ける。

vがあるがmがない行にマッチさせる

vi

にマッチする正規表現。

ここまできたら今までの応用で、

^(.*v)@=(.*m)@!.*$

と、v側は肯定、m側は否定にすればいい。

また、例のごとくmが1文字なのを利用して、

^(.*v)@=[^m]*$

とも書ける。

終わりに

「vimの行だけ見たいんや、emacsは目に入れたくないんや!」というときは、
おもむろに、

/\v^(.*vim)@=(.*emacs)@!.*$

と入力しよう。
vimだけが含まれている行がハイライトされる。
言い忘れていたけれど、私はemacs好きですよ。

……なお、これはvimじゃなくても肯定先読み、否定先読みができればOK。

たとえばperl正規表現の-Pオプションが使えるLinuxのgrepでは、

$ grep -P -r '^(?=.*\Walias\W)(?=.*\Wls\W).*$'# \W は単語区切り

とやれば、「lsに対してaliasを設定している行だけ」を抽出できる。
まるで検索エンジン!

$ grep -r 'alias'| grep 'ls'$ sed '/emacs/d'

とかはシェル芸に踏み込んでしまうのでここまで。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



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