名前付きキャプチャが便利
Rubyの正規表現で$1とか$2とかしなくても良くなる
Ruby1.9系?(1.9.2からかな)では正規表現が左辺にある場合、名前付きキャプチャが使えるようになってたらしいですよ。
従来はこんな感じで番号を主体にしていましたよね。
/programing (.+)\z/ =~ 'programing ruby' p $1 # => "ruby" p Regexp.last_match # => #<MatchData "programing ruby" 1:"ruby"> p Regexp.last_match[1] # => "ruby"
それに対して、グループの中で?<名前>とすると、こうなる
/programing (?<name>.+)\z/ =~ 'programing ruby' p $1 # => "ruby" p Regexp.last_match # => #<MatchData "programing ruby" name:"ruby"> p Regexp.last_match[1] # => "ruby" p Regexp.last_match[:name] # => "ruby" p name # => "ruby"
nameっていう変数にバインドされたり、last_matchにkeyでアクセスできる。もちろん、今までのように数値でもアクセスできる。
突然変数にバインドされるのはちょっとイヤな感じがしないでも無いけれど、きちんとスコープを短く保てていればアリかなって思いますし、名前付けされてるほうが可読性あがりますからね……。
参考:instance method Regexp#named_captures
参考:10 Things You Didn't Know Ruby Could do // Speaker Deck