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)