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