LoginSignup
16
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-01

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

まず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

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

参考

16
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16