Estoy usando este código:
s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
Para extraer números de cadenas como:
ABCD1234
ABCD1235
ABCD1236
etc.
Funciona, pero me pregunto qué otra alternativa tengo a esto en Ruby.
Mi código:
ids = []
someBigString.lines.each {|line|
ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
}
map
cómo debo entenderlo? Entiendo,collect
pero siempre he tenido problemas para entender el mapa.Hay muchas formas de Ruby según 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/, '')
Pruebe cada uno en su consola.
También consulte el informe de referencia en esa publicación.
fuente
hay una solución aún más simple
line.scan(/\d+/).first
fuente
'ab123cd45'.scan(/\d+/).first
que volvería12
La forma más sencilla y rápida es simplemente sacar todos los enteros de la cadena.
str = 'abc123def456' str.delete("^0-9") => "123456"
Al comparar los puntos de referencia en una cadena larga con algunas de las otras soluciones proporcionadas aquí, podemos ver que esto es órdenes de magnitud más rápido:
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)
fuente
your_input = "abc1cd2" your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i
Esto debería funcionar.
fuente
Otra solución puede ser escribir:
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.
Ahora, si escribe
myNumber = myString.to_i #or myString.to_f
Esto debería devolver un
fuente
Para extraer la parte numérica de una cadena, use lo siguiente:
str = 'abcd1234' /\d+/.match(str).try(:[], 0)
Debería volver
1234
fuente
match
otry
si usa esta sintaxis de coincidencia de cadenasstr[/\d+/]
.try
es core ruby, por lo que esta respuesta falla sinactive_support/core_ext/object/try.rb
o rieles