2009-09-29 6 views
26

Chciałbym wyrażenie regularne JavaScript, które będzie pasować do czasu, używając zegara 24-godzinnego, gdzie czas jest podany z dwukropkiem lub bez niego.Wyrażenie regularne odpowiadające czasowi w formacie wojskowym (24 godziny)

Na przykład chciałbym dopasować czas w następujących formatach:

  • 0800
  • 23:45
  • 2345

jednak, że nie będzie pasować do nieprawidłowych razy takie jak

  • 34:68
  • 5672
+2

Upvoted dla dając przykłady i kontr-przykłady. –

Odpowiedz

87

ten powinien zrobić:

^([01]\d|2[0-3]):?([0-5]\d)$ 

wyrażenie brzmi:

^  Start of string (anchor) 
(  begin capturing group 
    [01] a "0" or "1" 
    \d  any digit 
|  or 
    2[0-3] "2" followed by a character between 0 and 3 inclusive 
)  end capturing group 
:?  optional colon 
(  start capturing 
    [0-5] character between 0 and 5 
    \d  digit 
)  end group 
$  end of string anchor 
+4

24:00 nie istnieje, ale jest dopasowany. Zmień "[0-4]" na "[0-3]". – strager

+0

Ups .. mózgu źle – Greg

+0

lub w postaci: ^ (([0-9]) | ([0-1], [0-9]) | ([2], [0-3])) :? ([0-5] [0-9]) $ jeśli nie podoba ci się rzeczy \ d :) –

-1
/^(?:[01]\d|2[0-3]):?[0-5]\d$/ 
+0

To zostanie dopasowane 29:00 – Greg

+0

Naprawiono. Dzięki, Greg. –

5
/(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23):?(0|1|2|3|4|5)\d/ 

:)

+1

Nie dodałeś dwukropka jako opcjonalnego. –

+1

Dziękujemy. Pisałem numer zbyt szybko, więc zapomniałem go :) – Zed

+0

ta odpowiedź jest o wiele lepsza niż akceptowana. Przyjmowany jeden nieczytelny bez komentarzy – Toskan

-1

Nie sądzę regex jest właściwym rozwiązaniem tego problemu. Pewnie, MOŻNA to zrobić, ale wydaje się po prostu nie tak.

Upewnij się, że twój ciąg ma cztery znaki lub 5 znaków z dwukropkiem na środku. Następnie przeanalizuj każdą stronę i upewnij się, że lewa strona jest mniejsza niż 24, a prawa ręka jest mniejsza niż 60.

Rozwiązanie regex jest o wiele bardziej skomplikowane.

+0

Dlaczego regexp nie jest dobrym rozwiązaniem? – strager

+1

Czy nie czytałeś innych postów? Było wiele prób, a prawie nikt nie dostał poprawnego rozwiązania (lub nawet całkowicie zrozumiał problem). Moje rozwiązanie jest trudne do zepsucia w dowolnym języku lub implementacji. –

+2

Och, istnieje wiele sposobów na zepsucie rozwiązania. Zwłaszcza jeśli próbujesz pisać szybko tak, jak my. –

2

Aby utrzymać okrężnicy opcjonalne i pozwalają wszystkie poprawne razy:

([01]\d|2[0-3]):?[0-5]\d 

pamiętać, że ta zakłada północy zawsze będzie 0000 i nigdy 2400.

0

Here's a blog post, looking for the same thing i kilka potencjalnych odpowiedzi - z których większość nie działa, ale istnieje dobra dyskusja na temat przyczyn niepowodzenia każdej z nich.

Oczywiście, explicitly long and accurate jest zawsze możliwe!

+0

Tak, mógł po prostu wygenerować wszystkie możliwe razy tablica (powinna być mniejsza niż 16k), a następnie jest to tylko porównanie =) – Zed

-1

Zdjąć ':' jeśli ciąg ma jeden, a następnie, jeśli ciąg ma postać "DDDD", przekształcić go w int i porównać go do 2400.

+0

2380 jest nieprawidłowy. Musisz porównać obie strony, tak jak sugerowałem. –

+0

Ack, masz rację. –

0

Jest to jeden Właśnie wymyślić:

(^ ((2 [0-4]) | ([01]? [0-9])): [0-5] [0-9] $) | (^ ((1 [0- 2]) | (0? [1-9]) (: [0-5] [0-9])?) [Pa] m $)

akceptuje:

godzina czternasta 04:30 07:05 18:45 6:19 00:55

nie akceptuje "00:05 AM" - nie jestem pewien, czy istnieje taki czas jako „0AM”

Jeśli czujesz, że „:” jest opcjonalny format czasu 24h (wojskowy) - wystarczy dodać znak zapytania po

5

Oto ab zamiast rozwiązania górnego dla wojska i rozwiązania cywilnego.

Wojskowy

^(((([0-1][0-9])|(2[0-3])):?[0-5][0-9])|(24:?00)) 

wierzę ani w odpowiedzi najwyższa znamionowym nie jest właściwie analizowanie podzbiorów przed i po bez dodatkowego zestawu nawiasie grupy im. Ponadto, nie jestem pewien, że \d jest tylko 0-9 we wszystkich iteracjach. Technicznie zawiera specjalne [[:digit:]], chociaż nigdy wcześniej nie miałem do czynienia z tym problemem. Obojętnie jak to powinno zapewnić wszystko, co w tym crossover 2400/24: 00

cywilnego

^([0-9]|([1][0-2])):[0-5][0-9][[:space:]]?([ap][m]?|[AP][M]?) 

Jest to miłe cywilna wersja, która pozwala na pełny zakres sformatowany jak 12:30, 12: 30P, 12:30, 12:30, 12:30, 12:30 P, 12:30 lub 12:30 p, ale wymaga to, aby poranne znaki meridianów i postów były takie same, jeśli oba są włączone (brak am lub pM).

Używam obu tych elementów w tekście JavaScript do sprawdzania poprawności łańcuchów czasu.

+0

Dziękuję, Stijn, za pomoc w formatowaniu. –

+0

Dzięki, lubię ten. Dodałem jednak $ na końcu. Zrobiłem też 0 opcjonalnie na początku (tj. 01:25 może być 1:25). Mam nadzieję, że nic nie zepsuł po drodze.^(((([0-1]? [0-9]) | (2 [0-3])):? [0-5] [0-9]) | (24: 00)) – nardnob

+0

Cywil nie wydaje się działać. Jeśli rzucisz go na http://regexr.com/ i wypróbujesz 12: 30p, to nie zwróci żadnych dopasowań. – ThePersonWithoutC

0

Wiem, że to stare pytanie, ale tutaj jest regex, z którym wymyśliłem, co wydaje się działać.

^(([[0|1]\d)|(2[0-3]))[:]?([0-5]\d)$ 

Możesz edytować on this regex site

Edycja zdałem sobie sprawę, że ta odpowiedź skończyło się dokładnie tak samo jak zaakceptowanej odpowiedzi, ale będę go tu zostawić co najmniej do wartości z „zrobić to sam”Link

0

to jest doskonały:^0 ([0-9] [0-2]):? Tylko 12 Hr Zegar: [0-5] [0-9] $

Uwaga

Dla takich momentach: 0: 01- 12:59

lub

00:01 - 12:59

+0

Niestety: Jest to idealne: (([0-9] [0- 2]?) | ([0] [0-9])): [0-5] [0-9] $ – Byorn