くふんを狙え(vimグループ) このページをアンテナに追加 RSSフィード

くふんを狙え

 | 

2008-06-18/\&のメモ このエントリーを含むブックマーク このエントリーのブックマークコメント

/¥& - NaN days - subtech

/\&とか/\@=とか(幅ゼロの肯定先読み)のメモ。まず書かれているとおりに試す。

function! Test()
  let [id, param] = matchlist('id=motemen param=hoge', '\v.*id\=(\S+)&.*param\=(\S+)')[1:2]
  echo id
  echo param
endfunction
:w ~/t.vim
:so %
:call Test()

idとparamを逆にして試す。

function! Test()
  let s = 'id=motemen param=hoge'
  let s = 'param=hoge id=motemen'
  echo matchlist(s, '\v.*id\=(\S+)&.*param\=(\S+)')[1:2]
endfunction

属性名をclassからparamに変えてみる

function! Test()
  let s = 'param=hoge id=motemen'
  let s = 'class=kuhun id=eclipse-a'
  let pat = '\v.*id\=(\S+)&.*param\=(\S+)'
  let pat = '\v.*id\=(\S+)&.*class\=(\S+)'
  echo matchlist(s, pat)[1:2]
endfunction

/\vはあまり使わない(よくわかってないので/\m('magic')に変えてみる)

function! Test()
  let s = 'param=hoge id=motemen'
  let s = 'class=kuhun id=eclipse-a'
  let pat = '\v.*id\=(\S+)&.*param\=(\S+)'
  let pat = '\m.*id=\(\S\+\)\&.*class=\(\S\+\)'
  echo matchlist(s, pat)[1:2]
endfunction

/\&についてヘルプを見てみる

:h /\&
:h /\@=

よくわからないので、googleさんに聞いて、それっぽいのを見つけた。

(?=pattern)

肯定先読みを実行する部分式です。pattern に一致する文字列が始まる位置にある検索文字列と一致します。一致した文字列は記憶されず、後で使用することはできません。たとえば "Windows (?=95|98|NT|2000)" は、"Windows 2000" の "Windows" には一致しますが、"Windows 3.1" の "Windows" には一致しません。先読み処理では、読み進まれた文字は処理済みとは見なされません。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始されます。

http://msdn.microsoft.com/ja-jp/library/ae5bf541(VS.80).aspx

なんとなく分かった。先を読んで、マッチしてるか確認してから、うん。たぶん、そうだ。実験してみる。

echo matchlist('A=foo B=bar', '\m\(.*A=\S\+\)\@=\(.*B=\S\+\)')
" ['A=foo B=bar', 'A=foo', 'A=foo B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(.*A=\S\+\)\@=\(.*B=\S\+\)')
" ['B=bar', 'B=bar A=foo', 'B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(.*A=\S\+\)\&\(.*B=\S\+\)')
" ['B=bar', 'B=bar A=foo', 'B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(A=\S\+\)\&\(.*B=\S\+\)')
" []
echo matchlist('A=foo B=bar', '\m\(A=\S\+\)\&\(.*B=\S\+\)')
" ['A=foo B=bar', 'A=foo', 'A=foo B=bar', '', ...]
echo matchlist('A=foo B=bar', '\m\(A=\S\+\)\&\(B=\S\+\)')
" []

うーん。そうか。\@=の前の\(\)にはまったくマッチしないのね。幅ゼロだし。\&はみたまんま&&のイメージか。\|と並んで書かれているし。だから、パターン1\&パターン2と書いて、それぞれのパターンに\(\)を配置してやれば、うまくいくと。一つのパターンでid=,paramを続けるより、二つのパターンを\&でつなぐ形にするほうが、うまくいくと。そういうわけか。そういうわけなんだね。

ka-nachtka-nacht2008/06/18 16:53> /\vはあまり使わない(よくわかってないので/\m('magic')に変えてみる)
'magic'はデフォルトでonなので特に指定する必要はないですよ。

全然関係ですが個人的には/\@=などよりも/\zsや/\zeの方が分かり易くて好みです。

eclipse-aeclipse-a2008/06/18 20:42普段は特に指定していませんし、'magic'がデフォルトなのもバッチリ分かってますよ(普段はホント教えられてばかりですが……)。元の例で\vが使われていたし、せっかくだから、明示したほうがいいかな、そう思ってつけました。

私は普段使っている関係で/\mが好きです(先にも書いたようにわざわざつけることはまずありませんが)。/\vをオススメする人も居るみたいですが、私には逆に分かりにくいですね。+やら?は確かに\つけるの面倒ですけど、普段/\mを使ってると、急に/\vを見せられても、どれがどんな意味を持つのか分からなくなって、困ってしまいます。「ちょ、これ\つけなきゃいけねーのかよw」ってなります。

あと/\Vをescape()と併用するのも好きです。\ではじまらなきゃ安全、加えて\をescape()すれば、すべて安全。あれが好きです。正規表現のとっつきにくさってメタキャラクタの多さと、書きやすさを優先して同じ意味を持つ正規表現が複数あること(*と\{}と\{0,}が同じみたいに)だと思ってます。後者はどうしようもないですけど、前者に関しては/\Vはすごく良いと思うんです。とにかく\を使わなければいいし、\を使いたいときは二つ重ねればいいし。

私も/\zs,/\ze好きです。分かりやすいと思いますし、よく使います。ですから、そちらはパッと見た瞬間にわかるのですが、/\&やら/\@=やらはあんまりわかってなかったです。それで、こんなエントリができました。/\zs,/\zeみたいな普段から使っている、分かっていることに関してもたまには書いたほうが良いかもしれませんね。「自分の常識を共有する」みたいな意味で。

わざわざコメントありがとうございます。いつも参考になります。

MehfishanMehfishan2013/05/04 18:15Okay I'm cnvnoiced. Let's put it to action.

kdxirlubakdxirluba2013/05/07 23:57iKf6tj , [url=http://lwdwgxmmbphb.com/]lwdwgxmmbphb[/url], [link=http://mixdfzpdizvz.com/]mixdfzpdizvz[/link], http://lshweonjaiyt.com/

dpanoqaggddpanoqaggd2013/05/12 11:57rBBeL6 , [url=http://wlyjvpdetbpq.com/]wlyjvpdetbpq[/url], [link=http://qnvshvbhkxew.com/]qnvshvbhkxew[/link], http://xpldvbuhrjfz.com/

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080618
 | 
最近のコメント
最近のトラックバック
カレンダー
<< 2008/06 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
カウンター
94932