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

时间:2017-07-29 21:09:05

标签: ruby string-substitution

我想做字符串替换。使用gsubtr我可以给出一个输入字符并将其映射到单个输出值,但我想基于多个映射创建多个输出字符串:

swap = { 
  'a' => ['$', '%', '^'],
  'b' => ['3'],
  'c' => ['4', '@'],
}

对于输入字符串'abc',我应该得到以下输出字符串:

  • '$34'
  • '$3@'
  • '%34'
  • '%3@'
  • '^34'
  • '^3@'

对于任意数量的输入和映射,是否有一种简单的方法可以执行此操作?实际上,它可能是大约10个输入,最多3个映射,通常只有一个。

1 个答案:

答案 0 :(得分:6)

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

请参阅Hash::new(带有块),Hash#values_atArray#product。如果h = Hash.new { |_,k| [k] }h没有密钥k,则h[k]会返回[k]

swap = { 'a'=>['$', '%', '^'], 'b'=>['3'], 'c'=>['4', '@'] }

gen_products(swap, "abc")
  #=> ["$34", "$3@", "%34", "%3@", "^34", "^3@"]

下面

swap_all = Hash.new { |_,k| [k] }.merge(swap) 
  #=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
  #=> [["$", "%", "^"], ["3"], ["4", "@"]]

另一个例子:

gen_products(swap, "bca")
  #=> ["34$", "34%", "34^", "3@$", "3@%", "3@^"]

还有一个:

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

下面

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"]]