将散列的键替换为匹配正则表达式的特定组内的值

时间:2019-03-04 23:00:16

标签: regex ruby hash

我有一个输入:

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 :(得分:0)

我认为您可能追随以下情况,但是请告诉我我是否错了。

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 } 

使用默认proc 创建一个空散列,如果g[k]没有密钥k,则g返回k。 / p>

g.merge(h)

返回一个散列,该散列具有刚刚使用h中的键和值创建的默认proc。

有关Hash::new形式的文档,请参阅文档,该格式带有第二个作为哈希的参数。