Eqbal
Eqbal

Reputation: 1879

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

Upvotes: 1

Views: 139

Answers (2)

Niklas B.
Niklas B.

Reputation: 95318

Instead of a regex, you can use something like that:

s = "g12 327638474 83873478 2387327683 44 437643673476"
s.split[1..-1].select { |x| (7..14).include?(x.size) }.map(&:to_i)
# => [327638474, 83873478, 2387327683, 437643673476]

Upvotes: 2

the Tin Man
the Tin Man

Reputation: 160551

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.

Upvotes: 0

Related Questions