如何替换字符串中的字符
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】:构造方法
用 word 和 subs 参数定义你的方法:
def char_replacer word, subs
word.chars.map |c| subs.key?(c) ? subs[c] : c .join
end
这里我们使用了三元运算符,它本质上是一个更紧凑形式的 if-else 表达式。要注意的关键方法是String#chars
、Array#map
、Hash#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 啊是的好多了。以上是关于如何替换字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章