如何从哈希中仅提取时间项?

时间:2013-04-16 20:43:10

标签: ruby

我有一个像下面这样的哈希:

{"19th Apr, 2013" => :a, "20th Apr, 2013" => :b,"Tomorrow" => :c,"5:00 PM" => :d,"09:25 PM" => :e}

我想要输出:

{"5:00 PM" => :d,"09:25 PM" => :e}

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:6)

t = {"19th Apr, 2013" => :a, "20th Apr, 2013" => :b,"Tomorrow" => :c,"5:00 PM" => :d,"09:25 PM" => :e}

t.select { |k,v| Time.strptime(k,"%H:%M %P") rescue false }

#=>  {"5:00 PM"=>:d, "09:25 PM"=>:e}

答案 1 :(得分:0)

hash = {"19th Apr, 2013" => :a, "20th Apr, 2013" => :b,"Tomorrow" => :c,"5:00 PM" => :d,"09:25 PM" => :e}

hash.select { |k, v| k.match /\d{1,2}:\d{2} [AP]M/ }

给你:

{"5:00 PM"=>:d, "09:25 PM"=>:e}

就“完美”正则表达式而言,在其他答案评论中检查正则表达式战争;)

答案 2 :(得分:-2)

更一般的方法:

 hash = {"19th Apr, 2013" => :a, "20th Apr, 2013" => :b,"Tomorrow" => :c,"5:00 PM" => :d,"09:25 PM" => :e , "23:23" => :f}

 hash.delete_if{|k,v| k !~ /\d{1,2}:\d\d/}
  => {"5:00 PM"=>:d, "09:25 PM"=>:e, "23:23" => :f} 

注意:

  • 这也允许24小时格式时间
  • 这也处理小时只有一位数的情况

如果您不想处理24小时格式,请使用:

 hash = {"19th Apr, 2013" => :a, "20th Apr, 2013" => :b,"Tomorrow" => :c,"5:00 PM" => :d,"09:25 PM" => :e , "23:23" => :f}

 hash.delete_if{|k,v| k !~ /\d{1,2}:\d\d/ [AaPp][Mm]} # am AM pm PM
  => {"5:00 PM"=>:d, "09:25 PM"=>:e}