読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

名前付きキャプチャが便利

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