Q:

Regular expression in ruby and matching so many results

Trying to create a simple regular expression that can extract numbers(between 7 - 14) after a keyword starting with g letter and some id, something like following :  
(g)(\d{1,6})\s+(\d{7,14}\s*)+

Lets assume : 
m = (/(g)(\d{1,6})\s+(\d{7,14}\s*)+/i.match("g12 327638474 83873478 2387327683 44 437643673476"))

I have results of : 
#<MatchData "g23333 327638474 83873478 2387327683 " "g" "12" "2387327683 ">

But what I need as a final result , to include, 327638474, 83873478, 2387327683 and exclude 44. 
For now I just getting the last number 2387327683 with not including the previous numbers 
Any help here . 
cheers 

A:

Just as a FYI, here is a benchmark showing a bit faster way of accomplishing the selected answer:
require 'ap'
require 'benchmark'

n = 100_000

s = "g12 327638474 83873478 2387327683 44 437643673476"

ap s.split[1..-1].select { |x| (7..14).include? x.size }.map(&:to_i)
ap s.split[1..-1].select { |x| 7 <= x.size && x.size <= 14 }.map(&:to_i)

Benchmark.bm(11) do |b|
  b.report('include?'   ) { n.times{ s.split[1..-1].select { |x| (7..14).include? x.size }.map(&:to_i)     } }
  b.report('conditional') { n.times{ s.split[1..-1].select { |x| 7 <= x.size && x.size <= 14 }.map(&:to_i) } }
end

ruby ~/Desktop/test.rb 
[
    [0] 327638474,
    [1] 83873478,
    [2] 2387327683,
    [3] 437643673476
]
[
    [0] 327638474,
    [1] 83873478,
    [2] 2387327683,
    [3] 437643673476
]
                 user     system      total        real
include?     1.010000   0.000000   1.010000 (  1.011725)
conditional  0.830000   0.000000   0.830000 (  0.825746)

For speed I'll use the conditional test. It's a tiny bit more verbose, but is still easily read.

