Замените ключи хэша на его значение внутри определенной группы совпадающего регулярного выражения

#regex #ruby #hash

#регулярное выражение #ruby #хэш

Вопрос:

У меня есть входные:

 input = gets
  

в котором подстрока вида:

 "本資料由(Name of a contractor)提供"
  

отображается в разных позициях. У меня также есть тысячи имен подрядчиков и их английских транслитераций, хранящихся в хэше:

 hash = {'key1': 'value1', 'key2': 'value2'}
  

У меня есть следующий код:

 input.gsub!(/本資料由(. )提供/) {"nThe following information has been provided by: #{$1}n"} 
# => The following information has been provided by: (name of contractor)
  

Чтобы изменить собственное имя на английское, я могу сделать:

 person_making_announcement = /(The following information has been provided by: )(. )/.match(input)
if Company_making_the_Announcement[2].match "key1"
  input.gsub! Company_making_the_Announcement[2], "value1"
elsif Company_making_the_Announcement[2].match "key2"
  input.gsub! Company_making_the_Announcement[2], "value2"
end
  

Но это очень неуклюже, и они в любом случае нужны мне в хэше для других частей кода. Если я сделаю:

 hash.each do |k, v|
 input.gsub!("#{k}", "#{v}")
end
  

затем все совпадения в input будут изменены. Если я изменю метод на use sub! , будет изменен только первый экземпляр. Я думал, что сработает следующее:

 myregex = /(There is text here: )(. )/.match(input)
hash.each do |k, v|
  myregex[2].gsub!("#{k}", "#{v}")
end
  

Но это не так. Мне нужно сохранить регулярное выражение, поскольку оно является частью замены и модификации, ранее внесенной во входные данные.

Каким был бы синтаксис для внесения изменений только внутри определенной подгруппы в регулярном выражении, сопоставленном с входными данными?

Комментарии:

1. На самом деле, когда я говорю: «… пожалуйста, скажите мне, если я ошибаюсь». Я имею в виду «… пожалуйста, скажите мне, прав я или нет».

Ответ №1:

Я думаю, вам может понадобиться следующее, но, пожалуйста, скажите мне, если я ошибаюсь.

 def replace_em(str, h)
  str.gsub(/S /, Hash.new { |_,k| k }.merge(h))
end

h = { 'k1'=>'v1', 'k2'=>'v2' }
str = "Now is the k1 for all good persons to k2 to their friend k11"

replace_em(str, h)
  #=> "Now is the v1 for all good persons to v2 to their friend k11"
  

/S / сопоставляет строки символов, которые не содержат пробелов.

 g = Hash.new { |_,k| k } 
  

создает пустой хэш с по умолчанию учеб что причины g[k] для возврата k , если g нет ключа k .

 g.merge(h)
  

возвращает хэш, имеющий процедуру по умолчанию, только что созданную с ключами и значениями из h .

Форму Hash::new, которая принимает второй аргумент, являющийся хэшем, смотрите в документе.