2009-02-07 20 views
8

¿cómo puedo reemplazar 2 cadenas al mismo tiempo? por ejemplo, digamos que tengo cadena como esta:Reemplazar 2 cadenas al mismo tiempo?

str1 = "AAAA BBBB CCCC DDDD"

quiero reemplazar cada "AAAA" con "CCCC" y cada "CCCC" con "AAAA" pero si me hizo:

str1.gsub ("AAAA", "CCCC") # CCCC BBBB CCCC DDDD

str1.gsub ("CCCC", "AAAA") # AAAA AAAA BBBB DDDD

lo que quiero str1 sea "CCCC BBBB AAAA DDDD"

Respuesta

14

respuesta general:
Usar una expresión regular para que coincida tanto AAAA y CCCC, a continuación, sustituir a cada partido con CCCC y AAAA, respectivamente.

edición a aclarar la confusión

str1.gsub(/(AAAA|CCCC)/) { $1 == 'AAAA' ? 'CCCC' : 'AAAA' } 

edición pensé en una forma más elegante también :)

str1.gsub(/((AAAA)|(CCCC))/) { $2 ? 'CCCC' : 'AAAA' } 
+0

De acuerdo, parece una solución mucho mejor que las otras sugerencias. Sin embargo, no puedo descifrar cuál sería la expresión regular. –

+0

Simplemente use el operador de alternancia: AAAA | CCCC – Morendil

+0

De acuerdo Morendil, pero ¿cómo sería la sintaxis de reemplazo? Tendrá que poner sus hallazgos en grupos como: (AAAA) | (CCCC) Y luego hacer algún tipo de truco en el reemplazo con \ 1 y \ 2. –

0

Es una opción para que sustituya AAAA con algo más primero y luego proceder?

str1.gsub("AAAA","WXYZ") # WXYZ BBBB CCCC DDDD 
str1.gsub("CCCC","AAAA") # WXYZ BBBB AAAA DDDD 
str1.gsub("WXYZ","CCCC") # CCCC BBBB AAAA DDDD 
+0

Solo tenga cuidado al elegir la cadena temporal para reemplazar AAAA, no debería existir en la cadena original. – alexandrul

+0

No sé por qué el -1 estaba allí ... Técnicamente, la expresión regular (como idioma) no tiene memoria. es decir, la solución de aceptación anterior no debería funcionar. Alexandrul ya señaló la trampa. la expresión regular como herramienta puede hacer lo que hace la solución aceptada ... – Calyth

+0

"no debería funcionar"? eh –

0

Una solución (aunque algo en torno a la expresión regular sería lo mejor) sería algo en la línea de crear un hash de sustitución como tal, que puede ampliarse según sea necesario. Simplemente lo armé todo para demostrar. Estoy seguro de que con un poco más de amor y cuidado puede encontrar algo más elegante que funcione en la misma línea, ya que esta implementación solo funciona para cadenas con espacios.

str1 = "AAAA BBBB CCCC DDDD"  
replacements = { "AAAA" => "CCCC", "CCCC" => "AAAA", "XXXX" => "ZZZZ" } # etc... 

new_string = "" 
str1.split(" ").each do |s| 
    new_string += replacements[s] || s 
    new_string += " " 
end 

puts new_string # CCCC BBBB AAAA DDDD 
Cuestiones relacionadas