Case Regex Matching with Capture Groups
I ran into a problem where I wanted to use a case statement to match against a regex, but also capture some values from the matched data.
Say I want to match on a pair of numbers wrapped in parens like (2,4) and add them together.
If I match without capture groups I have to grab the numbers again in the when block:
x = "(2,4)"
case x
when /\(\d+,\d+\)/
a,b = x.scan(/\d+/)
a.to_i + b.to_i
end
# => 6
Seems a shame to have perform another op to get a and b. What if we used capturing groups like /\((\d+),\(d+)\)/? How do we refer to those captured values inside the when? We can use some of ruby's special variables, namely $1 and $2 to refer to the captured groups of the last regexp.
x = "(2,4)"
case x
when /\((\d+),(\d+)\)/
$1.to_i + $2.to_i
end
# => 6
$1 and $2 feel a little magic, so we can name our capture groups group1 and group2, and access those from $~ (the MatchData of the last regexp).
x = "(2,4)"
case x
when /\((?<group1>\d+),(?<group2>\d+)\)/
$~[:group1].to_i + $~[:group2].to_i
end
# => 6
Tweet