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