2010-04-14 24 views
50

Ich verwende diesen Code:Extract Anzahl von String in Ruby

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

, um die Nummern von Zeichenketten wie:

ABCD1234 
ABCD1235 
ABCD1236 

usw.

Es funktioniert, aber ich frage mich, was andere Alternative muss ich dazu in Ruby?

Mein Code:

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

Antwort

24
a.map {|x| x[/\d+/]} 
+0

Was die semantische von 'map' wie ist sollte ich es verstehen? Ich verstehe 'collect', aber ich hatte immer Schwierigkeiten, die Karte zu verstehen. – OscarRyz

+3

@Oscar Reyes, Enumerable # Karte ist ein Synonym für Enumerable # sammeln –

+3

FYI: Wenn Sie Nummern durch andere Zeichen aufgeteilt haben, greift dies nur den ersten "Brocken" von Zahlen. Für '123ABC456' wird nur '123' verwendet. Verwenden Sie etwas wie line.gsub (/ [^ 0-9] /, ''), wenn Sie alle Zahlen erhalten möchten. –

39

gibt es eine noch einfachere Lösung

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

Sehr klare Antwort. Danke: D – SSR

106

Es gibt viele Möglichkeiten, Ruby-per 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/, '')

Versuchen jeweils auf Sie trösten.

Überprüfen Sie auch den Benchmark-Bericht in diesem Post.

+13

Linie.delete ("^ 0-9") ist laut Link der Schnellste –

2

Eine andere Lösung kann zu schreiben sein:

myString = "sami103" 
myString.each_char{ |c| myString.delete!(c) if c.ord<48 or c.ord>57 } #In this case, we are deleting all characters that do not represent numbers. 

Nun, wenn Sie

myNumber = myString.to_i #or myString.to_f 

Dieser Typ sollte eine Rückkehr

+0

Im Allgemeinen ist die Verwendung von Ordnungszahlen wie dieser als eine allgemeine Lösung im Zeitalter von Multi-Byte-Zeichensätzen ein wenig gefährlich. Abhängig von den Charakteren, mit denen Sie zu tun haben, und dem Zeichensatz können die Ergebnisse in verschiedenen Gebietsschemas unterschiedliche Ergebnisse erzielen. –

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

Diese funktionieren sollte.

+0

Bitte bedenken Sie, dass Sie Ihren Post bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code tut und warum er das Problem löst. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – SuperBiasedMan

1

Um Nummernteil aus einer Zeichenkette verwenden Sie die folgende extrahieren:

str = 'abcd1234' 
/\d+/.match(str).try(:[], 0) 

Es zurückkehren sollte 1234