Я использую этот код:
s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
Чтобы извлечь числа из таких строк, как:
ABCD1234
ABCD1235
ABCD1236
и т.п.
Это работает, но мне интересно, какая еще альтернатива этому есть в Ruby?
Мой код:
ids = []
someBigString.lines.each {|line|
ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
}
map
как я должен это понимать? Я понимаю,collect
но у меня всегда были проблемы с пониманием карты.Есть много способов Ruby согласно 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/, '')
Попробуйте каждый на своей консоли.
Также проверьте отчет о тестировании в этом посте.
источник
есть еще более простое решение
line.scan(/\d+/).first
источник
'ab123cd45'.scan(/\d+/).first
бы просто вернулся12
Самый простой и быстрый способ - просто получить все целые числа из строки.
str = 'abc123def456' str.delete("^0-9") => "123456"
Сравнивая тесты на длинной строке с некоторыми другими решениями, представленными здесь, мы видим, что это на порядки быстрее:
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)
источник
your_input = "abc1cd2" your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i
Это должно сработать.
источник
Другим решением может быть запись:
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.
Теперь, если вы наберете
myNumber = myString.to_i #or myString.to_f
Это должно вернуть
источник
Чтобы извлечь числовую часть из строки, используйте следующее:
str = 'abcd1234' /\d+/.match(str).try(:[], 0)
Он должен вернуться
1234
источник
match
илиtry
если вы используете этот синтаксис сопоставления строкstr[/\d+/]
.try
не является основным рубином, поэтому этот ответ не работает безactive_support/core_ext/object/try.rb
или рельсов