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'])
Вы можете сделать что-то вроде этого:
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
Может быть более эффективное решение, но это, по крайней мере, делает код более чистым
Так как Ruby 1.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*"
Настройте таблицу сопоставления:
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)
и цитирование будет заботиться о вас.
Поздно к партии, но если вы хотите заменить некоторые символы одним, вы можете использовать регулярное выражение
string_to_replace.gsub(/_|,| /, '-')
В этом примере 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)