Ruby 2.4 Extracting captured data from Regexp results

Rohit Kumar

Rohit Kumar

November 10, 2016

This blog is part of our  Ruby 2.4 series.

Ruby has MatchData type which is returned by Regexp#match and Regexp.last_match.

It has methods #names and #captures to return the names used for capturing and the actual captured data respectively.

1
2pattern = /(?<number>\d+) (?<word>\w+)/
3match_data = pattern.match('100 thousand')
4#=> #<MatchData "100 thousand" number:"100" word:"thousand">
5
6>> match_data.names
7=> ["number", "word"]
8>> match_data.captures
9=> ["100", "thousand"]
10

If we want all named captures in a key value pair, we have to combine the result of names and captures.

1
2match_data.names.zip(match_data.captures).to_h
3#=> {"number"=>"100", "word"=>"thousand"}
4

Ruby 2.4 adds #named_captures which returns both the name and data of the capture groups.

1
2pattern=/(?<number>\d+) (?<word>\w+)/
3match_data = pattern.match('100 thousand')
4
5match_data.named_captures
6#=> {"number"=>"100", "word"=>"thousand"}
7

If this blog was helpful, check out our full blog archive.

Stay up to date with our blogs.

Subscribe to receive email notifications for new blog posts.