2012-09-21 21 views
5

En mi aplicación necesito poder encontrar todas las subcadenas numéricas, luego escanear cada una, encontrar la primera que coincida con un rango (como entre 5 y 15) y reemplazar esa instancia con otra cadena "X".ruby ​​regex - cómo reemplazar enésima instancia de una coincidencia en una cadena

Mi cadena de prueba s = "1 foo 100 bar 10 gee 1"

Mi patrón inicial es cualquier cadena de 1 o más dígitos, por ejemplo, re = Regexp.new(/\d+/)

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

Si quiero reemplazar el partido enésimo, y sólo el N ° partido, con "X" ¿cómo puedo?

Por ejemplo, si quiero reemplazar el tercer partido "10" (coincidencias [2]) que no pueden simplemente decir s[matches[2]] = "X" ya que hace dos reemplazos

"1 foo X0 bar X gee 1"

Cualquier ayuda se agradece !

Respuesta

7

String#gsub tiene un formulario que ocupa un bloque. Cede al bloque para cada partida y reemplaza la coincidencia con el resultado del bloque. Entonces:

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

Tengo que admitir que nunca se me ocurrió reemplazar las otras cerillas por ellas mismas ... ¡listo! ¡Gracias! – jpwynn

+1

Prefiero usar 'next' en lugar de devolver el valor original. – bwest

+0

El uso de bloques ayudó a resolver mi problema. ¡Gracias! – sbos61

Cuestiones relacionadas