Używam tego kodu:
s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
Aby wyodrębnić liczby z ciągów, takich jak:
ABCD1234
ABCD1235
ABCD1236
itp.
Działa, ale zastanawiam się, jaką inną alternatywę mam do tego w Rubim?
Mój kod:
ids = []
someBigString.lines.each {|line|
ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
}
map
jak mam to rozumieć? Rozumiem,collect
ale zawsze miałem problem ze zrozumieniem mapy.Jest wiele sposobów na Rubiego, jak na 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/, '')
Wypróbuj każdy na swojej konsoli.
Sprawdź również raport porównawczy w tym poście.
źródło
jest jeszcze prostsze rozwiązanie
line.scan(/\d+/).first
źródło
'ab123cd45'.scan(/\d+/).first
po prostu wrócę12
Najprostszym i najszybszym sposobem jest po prostu usunięcie wszystkich liczb całkowitych z łańcucha.
str = 'abc123def456' str.delete("^0-9") => "123456"
Porównując testy porównawcze na długim łańcuchu z niektórymi innymi przedstawionymi tutaj rozwiązaniami, widzimy, że jest to szybsze o rząd wielkości:
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)
źródło
your_input = "abc1cd2" your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i
To powinno działać.
źródło
Innym rozwiązaniem może być napisanie:
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.
Teraz, jeśli piszesz
myNumber = myString.to_i #or myString.to_f
Powinno to zwrócić plik
źródło
Aby wyodrębnić część liczbową z ciągu, użyj:
str = 'abcd1234' /\d+/.match(str).try(:[], 0)
Powinien powrócić
1234
źródło
match
lubtry
jeśli używasz tej składni pasującej do ciągustr[/\d+/]
.try
nie jest rdzeń Ruby więc ta odpowiedź nie bezactive_support/core_ext/object/try.rb
lub szyn