僕が一番 Vim の正規表現をうまく使えるんだ(\zs \ze 編)


2012年 03月 16日

問題

Vim の正規表現はとても豊富で、ベーシックなものからアドバンスドなものまでかなりの道具が揃っています。
これを駆使すればありとあらゆる……は言い過ぎですが、
世の中のテキスト処理の九分九厘を快適に行うことができます。

ただ、あまりにも数が多いので、一体どこから覚えていけばいいのか困りますし、
:help に記載されているものの中には今後の人生で活用する機会があるかどうか分からないものもあります。
手っ取り早く正規表現力を高めて生産性を向上するには一先ずどれを覚えれば良いのでしょうか。

解答

まずは\zs\zeを覚えましょう。
この2つは正規表現のマッチの開始位置/終了位置を指定することができます。
これだけでは何のことやらさっぱりですが、以下のように応用することができます:

「foobar」の「foo」を指定

foo\zebar で表現できます(Perl 語で言うところの foo(?=bar))。
foo\(bar\)\@= でも同じものは表現できますが、
\ze を使う方が遥かに読み書きし易いです。

「foobar」の「bar」を指定

foo\zsbar で表現できます(Perl 語で言うところの (?<=foo)bar)。 \(foo\)\@<=bar でも同じものは表現できますが、 \zs を使う方が遥かに読み書きし易いです。 #### マッチしたテキストの一部だけを置換 例えば

<li><span>...</span><a href="..."><span class="..."> Close</span>
<span class="..."> Open</span><span class="..."> Details</span></a></li>

のような、いかにも機械的に生成されたHTMLをそれなりの見た目になるよう整形するとしましょう。

まずは適宜改行する必要があるのですが、これは `:%s/>\zs\ze …

<li>
<span>...</span>
<a href="...">
<span class="..."> Close</span>
<span class="..."> Open</span>
<span class="..."> Details</span>
</a>
</li>

ベタにやるなら :%s/>\r\)\(<\)/\1\r\2/g のようにすれば対応できます。 しかし \zs\ze を使う方が入力の手間が省けますし、 置換する文字列に本質的でないものを指定しなくて済むので、 こちらの方が良いです。 後は gg=G 等として綺麗にインデントしましょう:

<li>
  <span>...</span>
  <a href="...">
    <span class="..."> Close</span>
    <span class="..."> Open</span>
    <span class="..."> Details</span>
  </a>
</li>

予告

次回は Emacs 編です。