8

如何同时替换 2 个字符串?例如,假设我有这样的字符串:

str1 = "AAAA BBBB CCCC DDDD"

我想用“CCCC”替换每个“AAAA”,用“AAAA”替换每个“CCCC”,但如果我这样做了:

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

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

我希望 str1 成为“ CCCC BBBB AAAA DDDD”

4

3 回答 3

14

一般答案:
使用正则表达式来匹配 AAAA 和 CCCC,然后分别用 CCCC 和 AAAA 替换每个匹配项。

编辑以消除混乱

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

编辑我也想到了一种更优雅的方式:)

str1.gsub(/((AAAA)|(CCCC))/) { $2 ? 'CCCC' : 'AAAA' }
于 2009-02-07T17:24:35.270 回答
0

您是否可以先用其他东西替换 AAAA,然后再继续?

str1.gsub("AAAA","WXYZ") # WXYZ BBBB CCCC DDDD
str1.gsub("CCCC","AAAA") # WXYZ BBBB AAAA DDDD
str1.gsub("WXYZ","CCCC") # CCCC BBBB AAAA DDDD
于 2009-02-07T17:25:26.580 回答
0

一个解决方案(尽管基于正则表达式的东西最好)将类似于创建替换散列这样的东西,可以根据需要进行扩展。我只是快速将其放在一起进行演示。我敢肯定,多加一点爱和关怀,你可以想出一些更优雅的东西,它的工作原理与此实现仅适用于带空格的字符串相同。

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 
于 2009-02-07T18:02:54.087 回答