str = "Hello☺ World☹"
预期输出为:
"Hello:) World:("
我可以做这个: str.gsub("☺", ":)").gsub("☹", ":(")
还有其他方法可以让我在单个函数调用中完成此操作吗?就像是:
str.gsub(['s1', 's2'], ['r1', 'r2'])
str = "Hello☺ World☹"
预期输出为:
"Hello:) World:("
我可以做这个: str.gsub("☺", ":)").gsub("☹", ":(")
还有其他方法可以让我在单个函数调用中完成此操作吗?就像是:
str.gsub(['s1', 's2'], ['r1', 'r2'])
String#tr
做到这一点,但是替换为多个字符意味着我不能使用它。
Answers:
从Ruby 1.9.2开始,将String#gsub
hash作为第二个参数替换为匹配的键。您可以使用正则表达式来匹配需要替换的子字符串,并为要替换的值传递哈希值。
像这样:
'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*"
tr
。
设置映射表:
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
要替换的任何内容在正则表达式中具有特殊含义,则需要使用in。或者,多亏了steenslag,您可以使用:
re = Regexp.union(map.keys)
报价将为您服务。
map.each { |re, v| ... }
您可以执行以下操作:
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
可能有一个更有效的解决方案,但这至少使代码更简洁
replacements.each
吗?
each
是被调用的集合。stackoverflow.com/questions/11596879/...
replacements.reduce(str){|str,replacement| str.gsub(replacement[0],replacement[1])}
replacements.inject(str) { |str, (k,v)| str.gsub(k,v) }
并避免这样做[0]
和[1]
。
晚了聚会,但是如果您想用一个字符替换某些字符,可以使用正则表达式
string_to_replace.gsub(/_|,| /, '-')
在此示例中,gsub用下划线(-)替换了下划线(_),逗号(,)或()。
string_to_replace.gsub(/[_- ]/, '-')
以下是另一种简单易懂的方法:
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一次替换字符串中的多个字符,
例如,将“ h”替换为“ m”,将“ l”替换为“ 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)