如何在Ruby中使用正则表达式匹配作为哈希索引?

时间:2016-04-22 01:46:23

标签: ruby-on-rails ruby regex

我是Ruby的新手,我遇到了一个我无法解决的问题。

我正在尝试使用gsub()匹配字符串中的模式,然后将该匹配用作散列的索引。到目前为止,我还没弄清楚。这是一些代码:

farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment = "There are 'pig_num' pigs on this farm"

assessment.gsub(/'(.+?)'/, '\1') # => "There are pig_num pigs on this farm"
assessment.gsub(/'(.+?)'/, farm) # =>  "There are  pigs on this farm"
assessment.gsub(/'(.+?)'/, farm['\1']) # => TypeError: no implicit conversion of nil into String
assessment.gsub(/'(.+?)'/) { |key| farm[key] }

第一次调用gsub()表示我正在匹配我想要的字符串。

第二个电话是尝试使用the Ruby documentation site处的gsub(pattern, hash)风格。

第三个调用是尝试使用匹配作为索引来引用该值。

第四种是我认为可能使用lambda / proc / block工作的一些花哨的裤子。

我做错了什么?

4 个答案:

答案 0 :(得分:2)

farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment = "There are 'pig_num' pigs on this farm"

<强> 1
“您可能希望从场哈希中获取第一个对象,但您需要告诉您要从哪个哈希值中检索值”。否则,您需要像上面一样使用Integer和String类型。

assessment.gsub(/'(.+?)'/, '1') 

<强> 2 当您'gsub'字符串时,您会获得'pig_num',因为您在正则表达式中包含'',因此结果为"'pig_num'"。但是,哈希的关键是"pig_num""pig_num""'pig_num'"不同。这就是为什么你无法正确获取数据的原因。

assessment.gsub(/'(.+?)'/, farm)

第3 你不能在blacket中指向索引但是哈希键

assessment.gsub(/'(.+?)'/, farm["pig_num"].to_s) 

<强> 4 正如我之前所说,你得到"'pig_num'"作为关键。如果您打印出块内的键值,您将看到它。您需要将其更改为“纯密钥”。要删除引用,您可以再次使用gsub并使其为空而不是引用。 gsub!是一种破坏性方法,意味着修改原始值。如果仅使用gusb,则该方法返回修改后的值,但原始密钥本身(在这种情况下)不会更改。否则,您需要将新值分配给另一个变量。

assessment.gsub(/'(.+?)'/) { |key| p key.gsub!("\'", ""); farm[key] }

我希望这个答案对你有所帮助。干杯

答案 1 :(得分:1)

试试这个

assessment.gsub(/#{farm.keys.join('|')}/, farm)

答案 2 :(得分:0)

我在你的代码中看到正则表达式匹配它会识别'pig_num'是在farm哈希上找到的哈希键。所以你需要改变你的哈希值 farm = { "'pig_num'" => 5, "'horse_num'" => 2, "'cow_num'" => 4}或者您可以更改正则表达式。实施例

farm = { "'pig_num'" => 5, "'horse_num'" => 2, "'cow_num'" => 4}
assessment.gsub(/'(.+?)'/, farm) # =>  "There are 5 pigs on this farm"

或者

farm = { "pig_num" => 5, "horse_num" => 2, "cow_num" => 4}
assessment.gsub(/pig_num/, farm) # =>  "There are '5' pigs on this farm"

答案 3 :(得分:0)

通过一些小的调整,您可以使用sprintf%{name}%<name>s符号:

farm = { pig_num: 5, horse_num: 2, cow_num: 4 }
assessment = "There are '%{pig_num}' pigs on this farm"

sprintf(assessment, farm)
#=> "There are '5' pigs on this farm"