从Ruby中的字符串中提取数字

Osc*_*Ryz 69 ruby

我正在使用此代码:

s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0] 
Run Code Online (Sandbox Code Playgroud)

从字符串中提取数字,如:

ABCD1234
ABCD1235
ABCD1236
Run Code Online (Sandbox Code Playgroud)

等等

它有效,但我想知道在Ruby中我还有什么其他选择吗?

我的代码:

ids = [] 
someBigString.lines.each {|line|
   ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0] 
}
Run Code Online (Sandbox Code Playgroud)

Ami*_*tel 155

根据http://www.ruby-forum.com/topic/125709,有很多Ruby方法

  1. line.scan(/\d/).join('')
  2. line.gsub(/[^0-9]/, '')
  3. line.gsub(/[^\d]/, '')
  4. line.tr("^0-9", '')
  5. line.delete("^0-9")
  6. line.split(/[^\d]/).join
  7. line.gsub(/\D/, '')

在你的控制台上试试.

同时查看该帖子中的基准报告.

  • line.delete("^ 0-9")是最快的链接 (19认同)

小智 58

甚至更简单的解决方案

line.scan(/\d+/).first
Run Code Online (Sandbox Code Playgroud)


gle*_*ald 32

a.map {|x| x[/\d+/]}
Run Code Online (Sandbox Code Playgroud)

  • 还应阐明这适用于枚举,例如数组,而不是标题要求的字符串 (4认同)
  • @Oscar Reyes,Enumerable #map是Enumerable#collect的同义词 (3认同)
  • 仅供参考:如果你有其他角色分开的数字,这只会抓住数字的第一个"块".所以对于'123ABC456',它只会抓住'123'.如果你想获得所有数字,请使用类似line.gsub(/ [^ 0-9] /,'')的内容. (3认同)
  • NoMethodError:字符串的未定义方法“ map” (3认同)

lac*_*der 9

最简单和最快的方法是从字符串中取出所有整数。

str = 'abc123def456'

str.delete("^0-9")
=> "123456"
Run Code Online (Sandbox Code Playgroud)

将长字符串上的基准测试与此处提供的其他一些解决方案进行比较,我们可以看到接近 2nd 的delete速度最快tr

require 'benchmark'

n = 2 
string = [*'a'..'z'].concat([*1..1_000_000].map(&:to_s)).shuffle.join

Benchmark.bmbm do |x|
  x.report('scan') do
    n.times {string.scan(/\d/).join}
  end
  x.report('gsub') do
    n.times {string.gsub(/[^\d]/,"")}
  end
  x.report('gsub2') do
    n.times {string.gsub(/\D/, '')}
  end
  x.report('tr') do
    n.times {string.tr("^0-9","")}
  end
  x.report('delete') do
    n.times {string.delete('^0-9')}
  end
  x.report('split') do
    n.times {string.split(/[^\d]/).join}
  end
end

Rehearsal ------------------------------------------
scan     3.509973   0.187274   3.697247 (  3.717773)
gsub     0.229568   0.002790   0.232358 (  0.233961)
gsub2    0.307728   0.013435   0.321163 (  0.390262)
tr       0.021395   0.000223   0.021618 (  0.022297)
delete   0.021290   0.002280   0.023570 (  0.024365)
split    0.284935   0.010274   0.295209 (  0.299865)
--------------------------------- total: 4.591165sec

             user     system      total        real
scan     3.146615   0.126009   3.272624 (  3.281860)
gsub     0.211263   0.001515   0.212778 (  0.213170)
gsub2    0.208482   0.000424   0.208906 (  0.209339)
tr       0.015228   0.000086   0.015314 (  0.015387)
delete   0.015786   0.000128   0.015914 (  0.016050)
split    0.205096   0.002736   0.207832 (  0.208380)

Run Code Online (Sandbox Code Playgroud)