2013-04-16 11 views
5

mam Hash jak poniżej:Jak wyodrębnić tylko elementy czasu z hasza?

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

Chcę wyjście:

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

Czy ktoś może mi pomóc rozwiązać ten problem?

+0

z ciekawości - dlaczego używasz tak dziwnego hashu – Noz

+0

@ Dobre pytanie. Potrzebowałem go, aby uzyskać pewne wyniki, gdy używam 'nokogiri' na stronie [' tensports'] (http://www.tensports.com/schedule.php) –

+0

czy to rozwiązało twój problem? – Tilo

Odpowiedz

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} 
+0

Doceniam użycie Time.strptime – christianblais

+0

, które jest naprawdę złe - ponieważ w ten sposób oczekujesz tylko jednego określonego formatu czasu – Tilo

-2

bardziej ogólne podejście:

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} 

UWAGA:

  • ten umożliwia także 24-godzinny czas formacie
  • ten obsługuje również przypadek, gdy godzina jest tylko jedna pojedyncza cyfra

jeśli nie chcesz obsługiwać formatu 24-godzinnego, użyj:

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} 
+1

'/ \ d {1,2}: \ d {2} [AP] M /' może być lepszym wyrażeniem regularnym;) –

+1

nie, jeśli chcesz również obsłużyć 24-godzinny format – Tilo

+0

Prawda, po prostu odejdź od ' [AP] M' then. –

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/ } 

Daje:

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

miarę 'doskonałe' regex idzie sprawdzić wojnę regex w innych odpowiedzi komentarzach;)

+0

Dlaczego spadł bez komentarza? Byłbym wdzięczny za informację zwrotną, jeśli ta odpowiedź jest błędna :) –

+0

Poddałem się pod głosowanie, aby zrównoważyć równowagę. Doceniam również opinie na temat downvotes. – christianblais

Powiązane problemy