97 votes

Extraire un nombre d'une chaîne de caractères en Ruby

J'utilise ce code :

s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0] 

Pour extraire des nombres de chaînes de caractères comme :

ABCD1234
ABCD1235
ABCD1236

etc.

Cela fonctionne, mais je me demande quelle autre alternative j'ai pour faire cela en Ruby ?

Mon code :

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

207voto

Amit Patel Points 2478

Il existe de nombreux moyens de Ruby selon http://www.ruby-forum.com/topic/125709

  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/, '')

Essayez chacun d'entre eux sur votre console.

Consultez également le rapport d'évaluation des performances dans cet article.

35 votes

Line.delete("^0-9") est le plus rapide d'après le lien

0 votes

La suppression est la plus rapide comme indiqué dans ma réponse ci-dessous.

67voto

binarycode Points 1090

Il existe une solution encore plus simple

line.scan(/\d+/).first

0 votes

Ne renvoie que la première correspondance de nombres consécutifs de la chaîne. Ainsi, le 'ab123cd45'.scan(/\d+/).first renverrait simplement 12

42voto

glenn mcdonald Points 8933
a.map {|x| x[/\d+/]}

0 votes

Quelle est la sémantique de map comment dois-je le comprendre ? Je comprends collect mais j'ai toujours eu du mal à comprendre map.

3 votes

@Oscar Reyes, Enumerable#map est un synonyme de Enumerable#collect

4 votes

Pour information : Si vous avez des nombres séparés par d'autres caractères, le programme ne retient que le premier "bloc" de nombres. Donc pour '123ABC456', il ne prendra que '123'. Utilisez quelque chose comme line.gsub(/[^0-9]/, '') si vous voulez obtenir tous les chiffres.

18voto

lacostenycoder Points 401

La méthode la plus simple et la plus rapide consiste à utiliser une expression régulière pour analyser les nombres entiers de la chaîne.

str = 'abc123def456' 

str.delete("^0-9")
=> "123456"

str.tr("^0-9","")
=> "123456"

Si l'on compare les points de repère sur une longue chaîne avec certaines des autres solutions proposées ici, on constate que tr est le plus rapide avec delete proche de la 2e.

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)

4voto

Rohit Patel Points 121
your_input = "abc1cd2"
your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i

Cela devrait fonctionner.

0 votes

Veuillez envisager d'éditer votre message pour ajouter plus d'explications sur ce que fait votre code et pourquoi il résoudra le problème. Une réponse qui ne contient que du code (même s'il fonctionne) n'aide généralement pas l'OP à comprendre son problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X