2013-04-22 44 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