正規表現置換の練習ドリル5問
:s///の基本形は使えても、グループ参照や大文字小文字変換を組み合わせたパターンになると、実行結果を正確に予測できるか怪しくなる人も多いはずです。5問の予測ドリルで正規表現置換の感覚を確かめてください。
表記のルール:コマンドを実行する前のテキストを示し、実行後どうなるかを予測してから答えを確認します。
問題1
次のテキストに対して:s/\(\d\d\)\/\(\d\d\)/\2\/\1/を実行すると、どうなりますか。
Date: 03/08
答えを見る
\(...\)でグループ化した「03」と「08」を、置換後の文字列側で\2(2番目のグループ)→\1(1番目のグループ)の順に入れ替えて出力します。月日の並び順を逆にする置換です。
Date: 08/03
問題2
次のテキストに対して:s/\(.*\)/\U\1/を実行すると、どうなりますか。
hello world
答えを見る
\(.*\)で行全体をグループ化し、置換後の文字列で\Uを使うと、それ以降の文字列(\1で参照した部分)がすべて大文字に変換されます。
HELLO WORLD
問題3
次のテキストに対して:%s/\<./\u&/gを実行すると、どうなりますか。
the quick brown fox
答えを見る
\<.は各単語の先頭1文字にマッチします。置換後の\u&は、マッチした文字(&はマッチ全体を表す)の最初の1文字だけを大文字化します。結果として各単語の頭文字が大文字になります。
The Quick Brown Fox
問題4
次のテキストに対して:s/foo\zsbar/baz/を実行すると、どうなりますか。
foobar and foobaz
答えを見る
\zsは「ここから実際のマッチ開始位置とする」という指定です。パターン全体は「foobar」にマッチさせつつ、実際に置換される範囲は\zsより後ろの「bar」だけになります。「foo」は残ったまま「bar」だけが「baz」に変わります。
foobaz and foobaz
問題5
次のテキストに対して:s/,\s*/\r/gを実行すると、どうなりますか。
apple, banana, cherry
答えを見る
,\s*はカンマとその直後の任意個の空白にマッチします。置換後の文字列\rは改行を挿入する特殊な指定で、カンマ区切りのテキストを1行1項目に分割します。
apple
banana
cherry
\1/\2、大文字小文字変換の\U/\u、マッチ開始位置を調整する\zsを覚えると、置換パターンの表現力が一気に広がります。
\zsを知らなかった頃は、部分置換のためにグループ参照を使った長いパターンを書いていましたが、\zsを覚えてからは「マッチはさせたいが置換したくない部分」を素直に書けるようになり、パターン自体がずっと短くシンプルになりました。
まとめ
正規表現置換はグループ参照・大文字小文字変換・\zsのような特殊指定を組み合わせることで、単純な文字列置換では対応できない変換までカバーできます。基本形からもう一歩踏み込んだパターンは:substituteコマンド活用集もあわせて参照してください。