2012-09-21 8 views
5

Nella mia app ho bisogno di essere in grado di trovare tutte le sottostringhe del numero, quindi scansionare ciascuna, trovare la prima che corrisponde a un intervallo (ad esempio tra 5 e 15) e sostituire quell'istanza con un'altra stringa "X".ruby ​​regex - come sostituire l'istanza nth di una corrispondenza in una stringa

mia stringa di prova s = "1 foo 100 bar 10 gee 1"

Il mio modello iniziale è qualsiasi stringa di 1 o più cifre, ad esempio, re = Regexp.new(/\d+/)

matches = s.scan(re)["1", "100", "10", "1"]

Se voglio sostituire il match ennesimo, e solo il Nona partita, con "X" come faccio?

Per esempio se voglio sostituire la terza partita "10" (partite [2]) non posso solo dire s[matches[2]] = "X" causa che fa due sostituzioni

"1 foo X0 bar X gee 1"

Qualsiasi aiuto sarebbe apprezzato !

risposta

7

String#gsub ha un modulo che accetta un blocco. Si arrende al blocco per ogni partita e sostituisce la partita con il risultato del blocco. Quindi:

first = true 
"1 foo 100 bar 10 gee 1 12".gsub(/\d+/) do |digits| 
    number = digits.to_i 
    if number >= 5 && number <= 15 && first 
    # do the replacement 
    first = false 
    'X' 
    else 
    # don't replace; i.e. replace with itself 
    digits 
    end 
end 
# => "1 foo 100 bar X gee 1 12" 
+0

devo ammettere che non mi è mai accaduto di sostituire le altre partite con se stesse ... intelligente! Grazie! – jpwynn

+1

Preferisco usare 'next' invece di restituire il valore originale. – bwest

+0

L'uso dei blocchi ha aiutato a risolvere il mio problema. Grazie! – sbos61

Problemi correlati