str = "Hello☺ World☹"
预期输出为:
"Hello:) World:("
我可以这样做:str.gsub("☺", ":)").gsub("☹", ":(")
有没有其他方法可以让我在一次函数调用中完成这项工作?类似于:
str.gsub(['s1', 's2'], ['r1', 'r2'])
发布于 2011-11-15 15:03:58
从Ruby1.9.2开始,String#gsub
接受哈希作为第二个参数,用于替换为匹配的键。您可以使用正则表达式来匹配需要替换的子字符串,并传递要替换的值的哈希。
如下所示:
'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*"
发布于 2011-11-15 15:14:10
设置映射表:
map = {'☺' => ':)', '☹' => ':(' }
然后构建一个正则表达式:
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
。或者,多亏了steenslag,你可以使用:
re = Regexp.union(map.keys)
我们将为您处理报价事宜。
发布于 2011-11-15 14:56:26
你可以这样做:
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
可能有一种更有效的解决方案,但这至少使代码更简洁一些
https://stackoverflow.com/questions/8132492
复制相似问题