优雅,简单的Ruby方式来gsub!/ sub!输入时数组/哈希中的值与另一个值中的值?

时间:2019-02-25 16:50:14

标签: arrays ruby hash gsub

我正在转换的输入,理想情况下始终包含以下行:

本资料由(上市公司)“以中文显示的公司名称“公司提供

直到现在我有以下内容:

input = gets

input.gsub!(/(本資料由\(上市公司\))(.{1,10})(公司提供)/)  {"
The following information has been provided by: #{$2}\n"}

Company_making_the_Announcement = /(The following information has been provided by: )(.+)/.match(input)

if Company_making_the_Announcement[2].match "如興"
input.gsub! Company_making_the_Announcement[2], "Roo Hsing Co., Ltd (TSEC:4414)"

elsif Company_making_the_Announcement[2].match "新潤"
input.gsub! Company_making_the_Announcement[2], "Shin Ruenn development Co., LTD. (GTSM:6186)"

elsif Company_making_the_Announcement[2].match "遠東商銀"
input.gsub! Company_making_the_Announcement[2], "Far Eastern International Bank Ltd. (TSEC:2845)"

end

上面的代码工作得很好,但是有点笨拙,特别是因为公司的列表成千上万,并且随着我添加新公司,代码将大大增加。 因此,我想到了一种更有效,更优雅的方法。 我以为使用数组/哈希可以解决问题,但是我不走运,因为无论我如何修改,以下代码都会不断返回错误:

companieslist = [{chin: '如興', eng: 'Roo Hsing Co., Ltd (TSEC:4414)' }, {chin: '新潤', eng: 'Shin Ruenn development Co., LTD. (GTSM:6186)' }]

Company_making_the_Announcement = /(The following information has been provided by: )(companieslist[:chin])/.match(input) 

If Company_making_the_Announcement[2].match (companieslist[:chin])
Input.gsub! Company_making_the_Announcement[2], (companieslist[:eng])

end

因此,简而言之,将数组(中文名称)中的值与另一个(英文名称)中的值进行匹配并将输入中出现的第一个值替换为第二个值的有效方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:1)

您处在正确的轨道上,只是没有利用哈希值。 而不是使用散列数组,而只需使用哈希,将中文公司名称作为关键字,将英文名称作为值。

companies = {'如興': 'Roo Hsing Co., Ltd (TSEC:4414)', '新潤': 'Shin Ruenn development Co., LTD. (GTSM:6186)' }

input = "如興 blah blah blah"

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

puts(input)
# Roo Hsing Co., Ltd (TSEC:4414) blah blah blah

请注意,这是假设您要翻译每个中文公司名称的每个实例。如果公司名称重叠,则需要使用稍微不同的方法。