2015-11-04 35 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將來可能會更改