TIM Labs

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

| コメント(0) | トラックバック(0)

問題

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</\r/g でできます。

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

ベタにやるなら :%s/></>\r</g でも同じことができますし、 前後のパターンが複雑な場合でも :%s/\(>\)\(<\)/\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 編です。

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/285

コメントする

このブログ記事について

このページは、kanaが2012年3月16日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Windows XP SP3 + .Net Framework 4.0の組み合わせではSHA256が使えない」です。

次のブログ記事は「アニメ化決定! すべての Vim プラグインマネージャーは道を譲れ!!!!!!」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。