2013-04-22 77 views
2

我有一個散列將有條目類似於entry1,entry2等,我試圖計算它們出現多少次,但我也有一個條目類似於entry_hello。因此,當我嘗試統計他們出現的次數時,「entry_hello」也被計算在內。我在這裏有這個代碼,看看每個條目是否匹配,但這不符合我的預期。沒有找到與正則表達式的哈希鍵值

hash = {} 
hash['entry'] = 'Test1' 
hash['entry_date'] = 'Test2' 
hash['entry2'] = 'Test3' 

hash.each do |x| 
puts x.to_s.scan(/entry\d?$/).count 
end 

但在這種情況下,沒有被發現,但沒有$的「entry_hello」計數。我已經嘗試過使用字符串,這可以工作,但是當我使用散列鍵嘗試時,它不會。我不明白爲什麼它不起作用,並且想知道如何讓這個工作或另一種方法來做到這一點。

UPDATE: 對於任何人誰在乎:我的代碼沒有工作的原因是因爲x在這種情況下是鍵/值對這樣x不等於「項目」或「ENTRY2」,而是相當於「entryTest1 '或'entry2Test3'。

由於下面的hash.count{|k, _| k =~ /\Aentry\d?\z/}中的下劃線代表的是Sawa的答案,它意味着當閉包接受第二個參數時,它不會被賦值。

我可能會繼續並使用hash.keys.count{|k| k =~ /\Aentry\d?\z/ },因爲這對我來說更容易理解。這裏的關鍵是key's部分,因爲現在您只查看散列鍵而不是鍵和值。

+0

我使用紅寶石1.8.7(2010-12-23 patchlevel 330)[i386-mingw32] – 2013-04-22 15:40:24

+0

我沒有弄清楚這一點,但信用反而去了我的一個朋友。 – 2013-04-22 18:43:28

回答

2
hash.count{|k, _| k =~ /\Aentry\d?\z/} 

'entry_date'將匹配/entry\d?/沒有\z$

+0

你能解釋爲什麼問題中的代碼不工作嗎? – 2013-04-22 15:33:20

+0

謝謝你的解決方案,我也是第二dan1111的問題,爲什麼我的原始不工作。我認爲問題的一部分是使用'$'行尾字符與字符串'\ z'結尾? – 2013-04-22 15:44:08

+0

這裏沒有區別,但從語義上來說,字符串的結尾比行結束更有意義。 – sawa 2013-04-22 16:00:36