Ruby

case文の条件で正規表現を使って内部でマッチ部分を使いたいとき

More than 3 years have passed since last update.

タイトルが意味不明なのでとりあえず下のコードを見て欲しいです。

まずrubyではcase文の条件に正規表現が使えます。

そこで、caseでStringを渡し、whenを正規表現で表し、さらに分岐後にそのマッチ部分を使いたいといったとき以下のように書いていました。

message = "2015年05月01日"

case message
when /\d{4}年\d{2}月\d{2}日/
m = message.match(/(\d{4})年(\d{2})月(\d{2})日/)
puts "#{m[1]}/#{m[2]}/#{m[3]}" # => 2015/05/01
else
puts "not match."
end

これだと正規表現の部分が冗長だし、なにより全然rubyっぽくない。

そこで、\$1, $2, ... という特殊変数はキャプチャーされた部分文字列が格納されるので、これを使うことでかなりシンプルになります。

message = "2015年05月01日"

case message
when /(\d{4})年(\d{2})月(\d{2})日/
puts "#{$1}/#{$2}/#{$3}" # => 2015/05/01
else
puts "not match."
end

他にも良い書き方がありましたらコメントでお知らせください。


参考

http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fregexp.html