如何替换字符串中的字符

Posted

技术标签:

【中文标题】如何替换字符串中的字符【英文标题】:How to replace the characters in a string 【发布时间】:2017-05-09 10:46:58 【问题描述】:

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

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 中的字符,我该如何解决这个问题以获得所需的输出?

【问题讨论】:

【参考方案1】:
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.

【讨论】:

我对此有点困惑..? 很好,我从未见过gsub(pattern, hash)。不过,您应该编辑您对 gsub with block 的评论。【参考方案2】:
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"

对于 Ruby v2.2+(Object#itself 首次亮相时),可以编写

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

【讨论】:

【参考方案3】:

您可以尝试这样做:

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"

【讨论】:

【参考方案4】:

构造方法

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"

示例 2

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

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

【讨论】:

可以简单地使用subs[c] || c,而不是三进制。 @mudasobwa 啊是的好多了。

以上是关于如何替换字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章

linux sed 如何替换字符串中的反斜杠\

如何在perl中用'*'替换字符串中的所有字符

如何替换掉字符串里的空格?

在 C语言中字符串的替换如何实现的!

如何替换掉字符串里的空格?

SQL如何将一列表中的字符替换成另外一个字符