2011-08-31 13 views
5

Estoy buscando una manera concisa de incrementar todos los enteros encontrados en una cadena por +1 y devolver la cadena completa.Ruby: incrementa todos los enteros en una cadena por +1

Por ejemplo:

"1 plus 2 and 10 and 100" 

debe convertirse en

"2 plus 3 and 11 and 101" 

puedo encontrar todos los números enteros muy fácilmente con

"1 plus 2 and 10 and 100".scan(/\d+/) 

pero estoy atascado en este momento tratando de incremente y vuelva a unir las partes.

Gracias de antemano.

Respuesta

10

Usted podría utilizar el block form of String#gsub:

str = "1 plus 2 and 10 and 100".gsub(/\d+/) do |match| 
    match.to_i + 1 
end 

puts str 

salida:

2 plus 3 and 11 and 101 
+0

Sweet! Sabía que había una forma muy simple de hacer esto. ¡Gracias! – NullRef

+1

Eso es genial. No sabía que gsub tomó bloques. – jergason

0

Lo que sucede con su expresión regular es que no conserva el hilo original de la cadena para volver a colocarlo. Lo que hice fue para dividirlo utilizando espacios, detectar cuáles son las palabras o números enteros utilizando w.to_i != 0 (sin contar a 0 como un entero, es posible que desee mejorar este), agrega uno, y unirse de nuevo:

s = "1 plus 2 and 10 and 100" 

s.split(" ").map{ |e| if (e.to_i != 0) then e.to_i+1 else e end }.join(" ") 
=> "2 plus 3 and 11 and 101" 
5

el método gsub puede tomar en un bloque, por lo que puede hacer esto

>> "1 plus 2 and 10 and 100".gsub(/\d+/){|x|x.to_i+1} 
=> "2 plus 3 and 11 and 101" 
Cuestiones relacionadas