2016-04-22 18 views
0

我是Ruby新手,遇到了一個我無法解決的問題。如何在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的花式褲子。

我在做什麼錯?

回答

1

試試這個

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

Shishir ,你和Kei都工作過,但我給了你一個綠色檢查,因爲它很好,簡短而且令人困惑,就像Ruby一樣。 :) –

+2

您可能希望使用'Regexp.union(farm.keys)'代替'/#{farm.keys.join('|')} /'。 –

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


「你可能想從農場散列的第一個對象,但你需要告訴從中散列要檢索的價值。」否則,你只需要像上面那樣使用Integer和String類型。

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

當你'gsub'字符串,你'pig_num'因爲你包括''的正則表達式中,這樣的結果將是"'pig_num'" 。但是,散列的關鍵是"pig_num""pig_num""'pig_num'"是不同的。這就是爲什麼你無法正確獲取數據。

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

您不能指向索引中blacket但哈希鍵

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

正如我以前說過,你"'pig_num'"關鍵。如果你打印出塊內的鍵值,你會看到它。您需要將其更改爲「純鑰匙」。爲了擺脫引用,你可以再次使用gsub,並使其爲空而不是引號。 gsub!是一種破壞性方法,意味着修改原始值。如果您僅使用gusb,該方法將返回修改後的值,但原始密鑰本身(在此情況下)不會更改。否則,您需要將新值分配給另一個變量。

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

我希望這個答案對你有幫助。乾杯

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" 
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" 
相關問題