正規表現のすゝめ?
正規表現使、便利ですよね。使っていますか?
Webサービスの開発に関わっている人なら少なからず使ったことはあるのではないでしょうか。例えば、文字列置換やスクレイピング、バリデーション、Apache の mod_rewrite や Rails の routes のような URL 書き換えなどなど。
上で挙げた例はコード(設定ファイル)に含める正規表現ですが、それだけでなく、コードを書くときにも大変便利だと思います。効果を発揮するのは当然ながら検索や置換をするときです。正規表現が使えるのと使えないのでは効率はかなり変わってくるのではないでしょうか。コーディング時に役立ちそうな例を幾つか挙げてみます。
動作確認は Vim 7.2 で行いました。
複数行をまとめてコメントアウトしたい
次のコードを 2 行目から最終行までコメントアウトしたい場合、/* */ のスタイルでコメントアウトしようとすると、途中にあるヘッダコメントが邪魔になり、一度ではコメントアウトできません。
<?php function hoge() { } /** * ヘッダコメント */ function foo() { }
この場合、以下の正規表現でコメントアウトしたい行の行頭に "//" を付加すれば、途中で /* */ スタイルのコメントがあっても問題なく、コメントアウトしてくれます。
s/^/\/\/
これは高機能のエディタであれば備えている機能かもしれませんが。
文字の順番を入れ替えたい
年月日の書式を 'YYYY-MM-DD' から 'MM/DD/YY' 形式に変更したい場合を考えます。たくさんあると思ってください。
"2011-01-10" # => "01/10/11" にしたい
この場合はサブパターンを使ってマッチした部分をキャプチャし、後方参照を使い置き換えます。エスケープ文字だらけですね...。
s/\d\{2\}\(\d\{2\}\)-\(\d\{2\}\)-\(\d\{2\}\)/\2\/\3\/\1/
特定の文字だけを置換したい
"this" を "This" に置き換えたいとします。でも PHP では "$this" は呼び出し元オブジェクトの参照になるので、それは置換の対象から外したいという場合には。
<?php $this->str = "this is a pen.";
こんな感じで。
s/\([^$]\)this/\1This/
これだと文の先頭以外も大文字になってしまいますが。それはそれ、これはこれ。で。