8 Stimmen

2 Saiten gleichzeitig austauschen?

Wie kann ich 2 Zeichenfolgen gleichzeitig ersetzen? Nehmen wir zum Beispiel an, ich habe eine Zeichenfolge wie diese:

str1 = "AAAA BBBB CCCC DDDD"

Ich möchte jedes "AAAA" durch "CCCC" und jedes "CCCC" durch "AAAA" ersetzen, aber wenn ich das täte:

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

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

was str1 sein soll " CCCC BBBB AAAA DDDD"

14voto

Allgemeine Antwort:
Verwenden Sie eine Regex, um sowohl AAAA als auch CCCC zu finden, und ersetzen Sie dann jede Übereinstimmung durch CCCC bzw. AAAA.

bearbeiten um die Verwirrung zu beseitigen

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

bearbeiten ich habe auch an eine elegantere Lösung gedacht :)

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

0voto

JMD Punkte 7271

Besteht die Möglichkeit, zuerst AAAA durch etwas anderes zu ersetzen und dann fortzufahren?

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

0voto

Hates_ Punkte 62539

Eine Lösung (am besten auf der Basis von Regex) wäre die Erstellung eines Ersatz-Hashes, der nach Bedarf erweitert werden kann. Ich habe das nur schnell zusammengesetzt, um es zu demonstrieren. Ich bin sicher, dass Sie mit etwas mehr Liebe und Sorgfalt etwas Eleganteres finden können, das auf die gleiche Weise funktioniert, da diese Implementierung nur für Zeichenketten mit Leerzeichen funktioniert.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X