2011-08-31 19 views
5

Sto cercando un modo succinto per incrementare tutti gli interi si trovano in una stringa di +1 e restituire la stringa completa.Rubino: incrementare tutti gli interi in una stringa di +1

Ad esempio:

"1 plus 2 and 10 and 100" 

deve diventare

"2 plus 3 and 11 and 101" 

posso trovare tutti i numeri interi molto facilmente con

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

ma mi sono bloccato a questo punto cercare di incrementare e rimettere insieme le parti.

Grazie in anticipo.

risposta

10

È potrebbe utilizzare il block form of String#gsub: uscita

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

puts str 

:

2 plus 3 and 11 and 101 
+0

dolce! Sapevo che c'era un modo molto semplice per farlo. Grazie! – NullRef

+1

Questo è molto cool. Non sapevo che Gsub prendesse dei blocchi. – jergason

0

La cosa con il tuo regex è che non conserva la stringa originale nella catena al fine di rimetterlo. Quello che ho fatto è stato quello di dividere l'uso di spazi, di rilevare che sono parole o interi che utilizzano w.to_i != 0 (senza contare 0 come un intero, si potrebbe desiderare di migliorare questo), aggiungere uno, e unirsi indietro:

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

il metodo gsub può prendere in un blocco, in modo da poter fare questo

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