2009-02-07 7 views
8

come posso sostituire 2 stringhe nello stesso tempo? per esempio diciamo che ho stringa come questa:Sostituire 2 stringhe allo stesso tempo?

str1 = "AAAA BBBB CCCC DDDD"

voglio sostituire ogni "AAAA" con "CCCC" e ogni "CCCC" con "AAAA", ma se i ha fatto:

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

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

quello che voglio str1 di essere "CCCC BBBB AAAA DDDD"

risposta

14

risposta generale:
Usa una regex per abbinare sia AAAA e CCCC, quindi sostituire ogni partita con CCCC e AAAA, rispettivamente.

modifica per chiarire la confusione

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

modificare ho pensato a un modo più elegante troppo :)

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

D'accordo, sembra una soluzione molto migliore rispetto agli altri suggerimenti. Non riesco a capire cosa sarebbe la regex però. –

+0

Basta usare l'operatore di alternanza: AAAA | CCCC – Morendil

+0

Concordato Morendil, ma quale sarebbe la sintassi di sostituzione? Avrai bisogno di mettere le tue scoperte in gruppi come: (AAAA) | (CCCC) E poi fare qualche tipo di ingannevolezza nella sostituzione con \ 1 e \ 2. –

0

E 'un'opzione per voi per sostituire con qualcosa di AAAA prima di tutto e poi procedere?

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

Basta fare attenzione a scegliere la stringa temporanea per sostituire AAAA con, non dovrebbe esistere nella stringa originale. – alexandrul

+0

Non so perché il -1 fosse lì ... Tecnicamente, l'espressione regolare (come lingua) non ha memoria. vale a dire la soluzione accettata sopra non dovrebbe funzionare. Alexandrul ha già indicato il trabocchetto. l'espressione regolare come strumento può fare ciò che fa la soluzione accettata ... – Calyth

+0

"non dovrebbe funzionare"? eh –

0

Una soluzione (anche se qualcosa basata soprattutto regex sarebbe migliore) sarebbe qualcosa lungo le linee di creare un hash sostituzione come tale, che può essere esteso come necessario. Ho appena messo insieme questo per dimostrare. Sono sicuro che con un po 'più di affetto e cura puoi trovare qualcosa di più elegante che funzioni sulla stessa falsariga di questa implementazione solo per stringhe con spazi.

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