Ich benutze diesen Code:
s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
So extrahieren Sie Zahlen aus Zeichenfolgen wie:
ABCD1234
ABCD1235
ABCD1236
usw.
Es funktioniert, aber ich frage mich, welche andere Alternative ich dazu in Ruby habe.
Mein Code:
ids = []
someBigString.lines.each {|line|
ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
}
map
wie soll ich das verstehen? Ich verstehe,collect
aber ich hatte immer Probleme, die Karte zu verstehen.Es gibt viele Ruby-Möglichkeiten gemäß http://www.ruby-forum.com/topic/125709
line.scan(/\d/).join('')
line.gsub(/[^0-9]/, '')
line.gsub(/[^\d]/, '')
line.tr("^0-9", '')
line.delete("^0-9")
line.split(/[^\d]/).join
line.gsub(/\D/, '')
Probieren Sie jeden auf Ihrer Konsole aus.
Überprüfen Sie auch den Benchmark-Bericht in diesem Beitrag.
quelle
Es gibt noch einfachere Lösungen
line.scan(/\d+/).first
quelle
'ab123cd45'.scan(/\d+/).first
würde12
your_input = "abc1cd2" your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i
Das sollte funktionieren.
quelle
Der einfachste und schnellste Weg besteht darin, einfach alle ganzen Zahlen aus der Zeichenfolge herauszuholen.
str = 'abc123def456' str.delete("^0-9") => "123456"
Wenn wir Benchmarks auf einer langen Reihe mit einigen der anderen hier angebotenen Lösungen vergleichen, können wir sehen, dass dies um Größenordnungen schneller ist:
require 'benchmark' @string = [*'a'..'z'].concat([*1..10_000].map(&:to_s)).shuffle.join Benchmark.bm(10) do |x| x.report(:each_char) do @string.each_char{ |c| @string.delete!(c) if c.ord<48 or c.ord>57 } end x.report(:match) do |x| /\d+/.match(@string).to_s end x.report(:map) do |x| @string.split.map {|x| x[/\d+/]} end x.report(:gsub) do |x| @string.gsub(/\D/, '') end x.report(:delete) do @string.delete("^0-9") end end user system total real each_char 0.020000 0.020000 0.040000 ( 0.037325) match 0.000000 0.000000 0.000000 ( 0.001379) map 0.000000 0.000000 0.000000 ( 0.001414) gsub 0.000000 0.000000 0.000000 ( 0.000582) delete 0.000000 0.000000 0.000000 ( 0.000060)
quelle
Eine andere Lösung könnte sein, zu schreiben:
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 tippen
myNumber = myString.to_i #or myString.to_f
Dies sollte a zurückgeben
quelle
Verwenden Sie Folgendes, um einen Zahlenteil aus einer Zeichenfolge zu extrahieren:
str = 'abcd1234' /\d+/.match(str).try(:[], 0)
Es sollte zurückkehren
1234
quelle
match
odertry
wenn Sie diese String-Matching-Syntax verwendenstr[/\d+/]
.try
ist nicht Kern Rubin so diese Antwort ohne versagtactive_support/core_ext/object/try.rb
oder Schienen