如何替换字符串中的字符
我有一个方法,我想用它来替换字符串中的字符:
def complexity_level_two replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha'} word = "Cocoa!55" word_arr = word.split('') results = [] word_arr.each { |char| if replacements[char] != nil results.push(char.to_s.gsub!(replacements[char])) else results.push(char) end } end
我想要的字符串输出应该是: Cohacohaa!55
但是,当我运行此方法时,它不会替换字符,只输出字符串:
C o c o a ! 5 5
我在做什么错误,这个方法不会替换字符串中的正确字符以匹配hash
中的字符,如何解决这个问题以获得所需的输出?
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha'} word = "Cocoa!55" word.gsub(Regexp.union(replacements.keys), replacements) #⇒ "Cohacohaaya!55"
Regexp::union
, String#gsub
with hash 。
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }. tap { |h| h.default_proc = ->(h,k) { k } } "Cocoa!55".gsub(/./, replacements) #=> "Cohacohaaya!55"
请参阅Hash#default_proc =和Object#tap 。
gsub
检查字符串的每个字符。 如果replacements
将该字符作为键,则该字符将替换为替换中该键的值; else(由于默认的proc),字符被替换为自身(即保持不变)。
另一种方法是使用Hash #fetch :
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' } "Cocoa!55".gsub(/./) { |s| replacements.fetch(s) { |c| c } } #=> "Cohacohaaya!55"
对于Ruby v2.2 +(当Object#本身首次亮相时),可以编写
"Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) }
你可以尝试这样做:
my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' } my_word = "Cocoa!55" my_word.split('').map{|i| my_subs[i] || i}.join
>“Cohacohaaya!55”
构建方法
使用word和subs参数定义方法:
def char_replacer word, subs word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join end
在这里,我们使用了三元运算符,它本质上是一个更紧凑forms的if-else表达式。 需要注意的关键方法是String#chars
, Array#map
, Hash#key?
,请参阅ruby-docs以获取有关这些内容的更多信息。 现在设置完所有,您可以调用您的方法传递一个单词字符串和您选择的子哈希。
例1
my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' } my_word = "Cocoa!55" char_replacer my_word, my_subs #=> "Cohacohaaya!55"
例2
my_subs = { 'a' => 'p', 'e' => 'c' } my_word = "Cocoa!55" char_replacer my_word, my_subs #=> "Cocop!55"