Заменить ключи хеша его значением внутри определенной группы соответствующего регулярного выражения - PullRequest
0 голосов
/ 05 марта 2019

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

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 будут изменены.Если я изменю метод на использование sub!, будет изменен только первый экземпляр.Я думал, что будет работать следующее:

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

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

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

1 Ответ

0 голосов
/ 05 марта 2019

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

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 , который принимает второй аргумент, который является хешем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...