ruby 如何替换字符串中的字符

bvjxkvbb  于 2023-05-06  发布在  Ruby
关注(0)|答案(4)|浏览(173)

我有一个方法,我想用它来替换字符串中的字符:

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

我想要的字符串输出应该是:Cohacohaaya!55
然而,当我运行这个方法时,它不会替换字符,只输出字符串:

C
o
c
o
a
!
5
5

我做错了什么,使得这个方法不能替换字符串中的正确字符来匹配hash中的字符?如何修复此问题以获得所需的输出?

ufj5ltwl

ufj5ltwl1#

replacements = {
  'i' => 'eye', 'e' => 'eei',
  'a' => 'aya', 'o' => 'oha'}
word = "Cocoa!55"
word.gsub(Regexp.union(replacements.keys), replacements)
#⇒ "Cohacohaaya!55"

Regexp::unionString#gsub与哈希。

ndasle7k

ndasle7k2#

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将该字符作为键,则该字符将替换为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"

对于Rubyv2.2+(当Object#本身首次亮相时),可以编写

"Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) }
62lalag4

62lalag43#

你可以试着这样做:

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英寸

busg9geu

busg9geu4#

构造方法

使用 wordsubs 参数定义方法:

def char_replacer word, subs
  word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join
end

这里我们使用了三元运算符,它本质上是一个更紧凑形式的if-else表达式。要注意的关键方法是String#charsArray#mapHash#key?,有关这些方法的更多信息,请参见ruby-docs。现在设置好了,你可以调用你的方法,传递一个 word 字符串和你选择的 subs 哈希值。

示例1

my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' }
my_word = "Cocoa!55"

char_replacer my_word, my_subs #=> "Cohacohaaya!55"

示例二

my_subs = { 'a' => 'p', 'e' => 'c' }
my_word = "Cocoa!55"

char_replacer my_word, my_subs #=> "Cocop!55"

相关问题