在ruby中,我想用字符串替换一些字母,有更好的方法吗?
string = "my random string"
string.gsub(/a/, "@").gsub(/i/, "1").gsub(/o/, "0")`
如果我想替换" a"和" A"用" @",我知道我可以做.gsub(/a/i, "@")
,但如果我想替换每个" a"用" e"以及每一个" A"与" E"?有没有一种方法可以抽象它而不是像.gsub(/a/, "e").gsub(/A/, "E")
那样指定它们?
答案 0 :(得分:2)
您可以使用哈希。例如:
h = {'a' => '@', 'b' => 'B', 'A' => 'E'}
"aAbBcC".gsub(/[abA]/, h)
# => "@EBBcC"
答案 1 :(得分:2)
不是您的问题的答案,而是更多其他方法:使用translation:
'aaAA'.tr('aA', 'eE')
# => 'eeEE'
对于相同的转换,您还可以使用ascii表:
'aaAA'.gsub(/a/i) {|c| (c.ord + 4).chr}
# => 'eeEE'
其他示例(默认情况下使用最后一个字符):
'aAaabbXXX'.tr('baA', 'B@')
# => '@@@@BBXXX'
答案 2 :(得分:1)
以下是@Santosh的两个变种答案:
str ="aAbBcC"
h = {'a' => '@', 'b' => 'B', 'A' => 'E'}
<强>#1 强>
str.gsub(/[#{h.keys.join}]/, h) #=> "@EBBcC"
<强>#2 强>
h.default_proc = ->(_,k) { k }
str.gsub(/./, h) #=> "@EBBcC"
如果h
将来可能发生变化,这些可提供更好的可维护性
答案 3 :(得分:0)
你也可以传递gsub一个块
"my random string".gsub(/[aoi]/) do |match|
case match; when "a"; "@"; when "o"; "0"; when "i"; "I" end
end
# => "my r@nd0m strIng"
在这种情况下,哈希的使用当然要优雅得多,但是如果你有复杂的替换规则,那么将一个类专用于它就会派上用场。
"my random string".gsub(/[aoi]/) {|match| Substitute.new(match).result}
# => "my raws0m strAINng"