2015-11-04 129 views
1

在ruby中,我想用字符串替换一些字母,有没有更好的方法来做到这一点?gsub方法和正则表达式(区分大小写和不区分大小写)

string = "my random string" 
string.gsub(/a/, "@").gsub(/i/, "1").gsub(/o/, "0")` 

如果我想用“@”替换两个“A”和“A”,我知道我可以做.gsub(/a/i, "@"),但如果我想替换每个什么“一”与“E”和每个“A”与“E”?有没有抽象它的方式,而不是像.gsub(/a/, "e").gsub(/A/, "E")那样指定?

回答

2

您可以使用散列。例如:

h = {'a' => '@', 'b' => 'B', 'A' => 'E'} 
"aAbBcC".gsub(/[abA]/, h) 
# => "@EBBcC" 
2

不是一个真正的回答你的问题,但更多的其他的方式来进行:使用translation

'aaAA'.tr('aA', 'eE') 
# => 'eeEE' 

对于相同的变换,你也可以使用ASCII表:

'aaAA'.gsub(/a/i) {|c| (c.ord + 4).chr} 
# => 'eeEE' 

其他例子(最后一个字符被缺省使用):

'aAaabbXXX'.tr('baA', '[email protected]') 
# => '@@@@BBXXX' 
+0

这为什么不回答这个问题? –

+0

@CarySwoveland:我认为他正在寻找类似于:''aaAA'.buildInMethodOfYourMostCrazyDreams('a','e',FLAG_CASE_INSENSITIVE)''返回''eeEE'' –

0

您也可以通过GSUB块

"my random string".gsub(/[aoi]/) do |match| 
    case match; when "a"; "@"; when "o"; "0"; when "i"; "I" end 
end 
# => "my [email protected] strIng" 

使用哈希的当然是更优雅在这种情况下,但如果你有替代复杂的规则就可以派上用场献出类它。

"my random string".gsub(/[aoi]/) {|match| Substitute.new(match).result} 
# => "my raws0m strAINng" 
1

这里是桑托斯@的答案的两个变种:

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将来可能会更改