Ruby多个stringreplace

str = "Hello☺ World☹" 

预期的产出是:

 "Hello:) World:(" 

我可以这样做: str.gsub("☺", ":)").gsub("☹", ":(")

有没有其他的方式,我可以在一个单一的函数调用? 就像是:

 str.gsub(['s1', 's2'], ['r1', 'r2']) 

你可以做这样的事情:

 replacements = [ ["☺", ":)"], ["☹", ":("] ] replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])} 

可能会有更有效的解决scheme,但这至less可以使代码更清洁一点

从Ruby 1.9.2开始, String#gsub接受散列值作为第二个参数,用于匹配键的replace。 您可以使用正则expression式来匹配需要replace的子string,并将哈希值传递给要replace的值。

喜欢这个:

 'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*') #=> "h3ll*" '(0) 123-123.123'.gsub(/[()-,. ]/, '') #=> "0123123123" 

在Ruby 1.8.7中,你可以通过一个块来实现:

 dict = { 'e' => 3, 'o' => '*' } 'hello'.gsub /[eo]/ do |match| dict[match.to_s] end #=> "h3ll*" 

build立一个映射表:

 map = {'☺' => ':)', '☹' => ':(' } 

然后build立一个正则expression式:

 re = Regexp.new(map.keys.map { |x| Regexp.escape(x) }.join('|')) 

最后, gsub

 s = str.gsub(re, map) 

如果你被困在1.8的土地上,那么:

 s = str.gsub(re) { |m| map[m] } 

你需要里面的Regexp.escape ,以防你想要replace的东西在正则expression式中有特殊的含义。 或者,感谢steenslag,你可以使用:

 re = Regexp.union(map.keys) 

报价会照顾你。

晚了,但如果你想用一个replace某些字符,你可以使用正则expression式

 string_to_replace.gsub(/_|,| /, '-') 

在这个例子中,gsub用短划线( – )replace下划线(_),逗号(,)或()

另一个简单的方法,但容易阅读的是以下内容:

 str = '12 ene 2013' map = {'ene' => 'jan', 'abr'=>'apr', 'dic'=>'dec'} map.each {|k,v| str.sub!(k,v)} puts str # '12 jan 2013' 

您也可以使用tr一次replacestring中的多个字符,

例如,将“h”replace为“m”和“l”replace为“t”

 "hello".tr("hl", "mt") => "metto" 

看起来简单,整齐,快速(虽然没有太大的区别)比gsub

 puts Benchmark.measure {"hello".tr("hl", "mt") } 0.000000 0.000000 0.000000 ( 0.000007) puts Benchmark.measure{"hello".gsub(/[hl]/, 'h' => 'm', 'l' => 't') } 0.000000 0.000000 0.000000 ( 0.000021)