具有多个选项的Ruby字符串替换

具有多个选项的Ruby字符串替换,ruby,string-substitution,Ruby,String Substitution,我想做字符串替换。使用gsub或tr,我可以提供单个输入字符并将其映射到单个输出值,但我希望基于多个映射创建多个输出字符串: swap = { 'a' => ['$', '%', '^'], 'b' => ['3'], 'c' => ['4', '@'], } 对于输入字符串“abc”,我应该得到以下输出字符串: '$34' '$3@' '%34' '%3@' '^34' '^3@' 对于任意数量的输入和映射,有没有一种简单的方法可以做到这一点?实际上,它可能是

我想做字符串替换。使用gsub或tr,我可以提供单个输入字符并将其映射到单个输出值,但我希望基于多个映射创建多个输出字符串:

swap = { 
  'a' => ['$', '%', '^'],
  'b' => ['3'],
  'c' => ['4', '@'],
}
对于输入字符串“abc”,我应该得到以下输出字符串:

'$34' '$3@' '%34' '%3@' '^34' '^3@' 对于任意数量的输入和映射,有没有一种简单的方法可以做到这一点?实际上,它可能是大约10个输入,最多3个映射,通常只有一个

def gen_products(swap, str)
  swap_all = Hash.new { |_,k| [k] }.merge(swap) 
  arr = swap_all.values_at(*str.chars)
  arr.shift.product(*arr).map(&:join)
end
用方块看,然后。如果h=Hash.new{| |,k |[k]}并且h没有密钥k,则h[k]返回[k]

这里

另一个例子:

gen_products(swap, "bca")
  #=> ["34$", "34%", "34^", "3@$", "3@%", "3@^"]
还有一点:

gen_products(swap, "axbycx")
  #=> ["$x3y4x", "$x3y@x", "%x3y4x", "%x3y@x", "^x3y4x", "^x3y@x"]
这里

用方块看,然后。如果h=Hash.new{| |,k |[k]}并且h没有密钥k,则h[k]返回[k]

这里

另一个例子:

gen_products(swap, "bca")
  #=> ["34$", "34%", "34^", "3@$", "3@%", "3@^"]
还有一点:

gen_products(swap, "axbycx")
  #=> ["$x3y4x", "$x3y@x", "%x3y4x", "%x3y@x", "^x3y4x", "^x3y@x"]
这里


在这种情况下,它就像有三个嵌套的循环一样简单,它们枚举所有的组合,在最里面的循环中,您称之为tr/gsub。罗宾,谢谢你选择了我的答案,但是你真的应该等上一段时间,也许2个多小时,然后再颁发绿色奖章。快速选择可能会阻碍其他答案,而且在我看来,对仍在研究答案的其他人来说是不礼貌的。不用着急。请考虑删除复选标记,然后再决定。在这种情况下,简单地说,有三个嵌套循环,枚举所有组合,在最内层的循环中调用Tr/GSB。罗宾,谢谢你选择了我的答案,但是你真的应该等上一段时间,也许2个多小时,然后再颁发绿色奖章。快速选择可能会阻碍其他答案,而且在我看来,对仍在研究答案的其他人来说是不礼貌的。不用着急。请考虑删除复选标记,然后再决定。哦,这很聪明:忘记了。产品。递归地重新实现它。这看起来并不性感。您可以在赋值过程中通过first、*others=swap.values_at*str.chars分解数组,以便将方法的第二行缩短为first.product*others@Stefan,另一种不太理想的imo方法是arr=swap.values_at*str.chars;arr.shift.product*arr.刚意识到,如果str中有字符不在交换数组中,则此操作将失败,例如,您这样称呼它:gen_productsswap,abcxyz这是一个简单的修复方法吗?我希望在所有交换结束时保留xyz。哦,这很聪明:忘记了。product。递归地重新实现它。这看起来并不性感。您可以在赋值过程中通过first、*others=swap.values_at*str.chars分解数组,以便将方法的第二行缩短为first.product*others@Stefan,另一种不太理想的imo方法是arr=swap.values_at*str.chars;arr.shift.product*arr.刚刚意识到,如果str中有字符不在交换数组中,则此操作将失败,即,您这样称呼它:gen_productsswap,abcxyz这是一个简单的修复方法吗?我希望在所有交换结束时保留xyz。
swap_all = Hash.new { |_,k| [k] }.merge(swap)
  #=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
  #=> [["$", "%", "^"], ["x"], ["3"], ["y"], ["4", "@"], ["x"]]