【问题标题】:Replace 2 strings at the same time?同时替换2个字符串?
【发布时间】:2010-10-06 03:59:07
【问题描述】:

如何同时替换 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”

【问题讨论】:

    标签: ruby algorithm string replace


    【解决方案1】:

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

    编辑以消除混乱

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

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

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

    【讨论】:

    • 同意,这感觉是比其他建议更好的解决方案。我不知道正则表达式是什么。
    • 只需使用交替运算符:AAAA|CCCC
    • 同意 Morendil,但是替换语法是什么样的?您需要将您的发现分成如下组: (AAAA)|(CCCC) 然后在替换为 \1 和 \2 时做一些技巧。
    • javascript: "AAAA BBBB CCCC DDDD".replace(/AAAA|CCCC/g,function(a){ return a==="AAAA" ? "CCCC" : "AAAA";}) ;
    • 我之前的负面评论已被删除,现在我明白你的意思了。
    【解决方案2】:

    您是否可以先将 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
    

    【讨论】:

    • 请注意选择要替换 AAAA 的临时字符串,它不应该存在于原始字符串中。
    • 不知道为什么有-1...从技术上讲,正则表达式(作为一种语言)没有记忆。即上面的接受解决方案不应该工作。 Alexandrul 已经指出了这个陷阱。正则表达式作为一种工具可以做公认的解决方案所做的事情......
    【解决方案3】:

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

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-25
      • 2020-08-31
      • 2011-01-18
      • 1970-01-01
      • 2013-08-13
      • 2015-12-30
      • 2016-04-20
      相关资源
      最近更新 更多