用Ruby替换字符串中的字母

the*_*yst 1 ruby string replace

我想使用以下映射替换字符串中的字母:

letters = ("a".."z").to_a.zip(("b".."z").to_a.push("a"))
[["a", "b"], ["b", "c"], ["c", "d"], ["d", "e"], ["e", "f"], ["f", "g"], ["g", "h"], ["h", "i"], ["i", "j"], ["j", "k"], ["k", "l"], ["l", "m"], ["m", "n"], ["n", "o"], ["o", "p"], ["p", "q"], ["q", "r"], ["r", "s"], ["s", "t"], ["t", "u"], ["u", "v"], ["v", "w"], ["w", "x"], ["x", "y"], ["y", "z"], ["z", "a"]]
Run Code Online (Sandbox Code Playgroud)

从这里我只想替换字符串中的所有字母,所以我正在尝试的是

str = "Somebody help I am on drugs and can't program! Just kidding."

letters.each {|letter| str.gsub!(letter[0],letter[1])}

puts str
Run Code Online (Sandbox Code Playgroud)

回报

Saaaaaaa aaaa I aa aa aaaaa aaa aaa'a aaaaaaa! Jaaa aaaaaaa.
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我想要替换的东西被替换为a并忽略我在开始时创建的映射.有谁知道发生了什么?我从Ruby多字符串替换中得到了这个想法,但由于某种原因,这不适用于我的示例.

Har*_*pta 7

replace_with = (('b'..'z').to_a + ['a']).join('')
str = "Somebody help I am on drugs and can't program! Just kidding."

puts str.tr('a-z', replace_with)
# "Spnfcpez ifmq I bn po esvht boe dbo'u qsphsbn! Jvtu ljeejoh."
Run Code Online (Sandbox Code Playgroud)

要替换大写字母,str.downcase.tr('a-z', replace_with).

HTH

编辑:手动更换:

letters = Hash[('a'..'z').to_a.zip(('a'..'z').to_a.rotate)] # Thanks to @Jonathan
str = "Somebody help I am on drugs and can't program! Just kidding."
puts str.chars.inject([]) { |result, char| result << (letters[char] || char) }.join
# "Spnfcpez ifmq I bn po esvht boe dbo'u qsphsbn! Jvtu ljeejoh."
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,适用时使用`tr`.顺便说一句,你的`replace_with`也可以写成`[*'b'..'z','a'].join`,虽然没有真正的区别. (3认同)
  • 因为有很多方法可以给猫皮肤,你可以使用`replace_with =('a'..'z').to_a.rotate.join`如果你不喜欢splat. (2认同)