Vimの小ネタ。
Vimで正規表現を使うとき、Perlなんかと比べると制御文字を書くときにバックスラッシュを多用するため見にくく感じていた。たとえば、
を表す正規表現というと、Perlなら
で済むところ、Vimだと
となるのでめんどくせえ〜とか思ってたわけだ。
とんでもない間違いでした。
便利な制御文字があったんだね。こんなときに使うのが「
こちらが圧倒的に見易い。ちゃんとヘルプ読まないとダメだねorz
そしてさらに便利なのが「
このHTMLから
とやってもうまく行かない。
「可変長の後読みは未実装です」エラーになってしまう。しかしVimだと楽ちん。
これを知って検索・置換がずいぶん早くなった。
Vimで正規表現を使うとき、Perlなんかと比べると制御文字を書くときにバックスラッシュを多用するため見にくく感じていた。たとえば、
「abc」と「def」に挟まれた文字列
を表す正規表現というと、Perlなら
/(?<=abc).+(?=def)/
で済むところ、Vimだと
\(abc\)\@<=.\+\(def\)\@=
となるのでめんどくせえ〜とか思ってたわけだ。
とんでもない間違いでした。
便利な制御文字があったんだね。こんなときに使うのが「
\v」。これを使うと英数字以外が全て制御文字と見なされるので、表記が格段にシンプルになる。同じ例だと、\v(abc)@<=.+(def)@=
こちらが圧倒的に見易い。ちゃんとヘルプ読まないとダメだねorz
そしてさらに便利なのが「
\zs」と「\ze」。これは正規表現の「始まり」と「終わり」を表す。同じ例を表すと、abc\zs.\+\zedefちょっと見にくいかもしれないけど意味は同じだ。これを使えばPerlの正規表現では対応していない、「可変長の後読み」を実現できる。例えば、
<p>Hello!</p> <script>alert( "Hello!" )</script> <script type="javascript">alert( "Hello!" )</script>
このHTMLから
<script>タグの中身だけを取ろうとして、/(?<=<script.*>).+(?=<\/script>)/
とやってもうまく行かない。
$ perl -e '/(?<=<script.*>).+(?=<\/script>)/' Variable length lookbehind not implemented in regex m/(?<=<script.*>).+(?=</script>)/ at -e line 1.
「可変長の後読みは未実装です」エラーになってしまう。しかしVimだと楽ちん。
<script.*>\zs.\+\ze<\/script>
これを知って検索・置換がずいぶん早くなった。
- Newer: 【画像付き】Mac mini HDD 換装(その1〜ドライブユニットの取り外し〜)
- Older: 最新版GNU Screenで縦分割(その3〜captionとhardstatusについて〜)
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- http://blog.remora.cx/mt/mt-tb.fcgi/27
- Listed below are links to weblogs that reference
- Vimの正規表現 "\v", "\zs", "\ze" from blog.remora.cx

