Рубиновая замена нескольких строк



str = "Hello☺ World☹"


ожидаемый результат:



"Hello:) World:("


Я могу сделать это: str.gsub("☺", ":)").gsub("☹", ":(")



есть ли другой способ, чтобы я мог сделать это в одном вызове функции?. Что-то вроде:



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

6 ответов:

вы могли бы сделать что-то вроде этого:

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)

Comments

    Ничего не найдено.