Wyrażenie regularne do dopasowywania formatu czasu GG: MM


165

Potrzebuję wyrażenia regularnego do dopasowania czasu w formacie HH: MM. Oto co mam i to działa:

^[0-2][0-3]:[0-5][0-9]$

Dotyczy to wszystkiego od 00:00 do 23:59.

Jednak chcę to zmienić, aby dopasować również 0:00 i 1:00 itd., A także 00:00 i 01:30. To znaczy, aby skrajna lewa cyfra była opcjonalna, aby dopasować zarówno HH: MM, jak i H: MM.

Jakieś pomysły, jak to zmienić? Potrzebuję tego do pracy w javascript i php.


15
W rzeczywistości oryginalne wyrażenie regularne nie będzie pasować do całego zakresu prawidłowych wartości czasu, np. 17:00
David Clarke

Odpowiedzi:


366

Twoje oryginalne wyrażenie regularne ma wady: 04:00na przykład nie będzie pasować .

To może działać lepiej:

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

45
Ten regExp dotyczy czasu bez wiodącego zera. RegExp dla czasu z wiodącym zerem to^([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
SergO

15
@SergO, proszę uważniej przeczytać jego odpowiedź. Jego odpowiedź brzmi zarówno dla wiodącego zera, jak i bez.
Alexander,

11
Nieco krótszą formą jest^(?:\d|[01]\d|2[0-3]):[0-5]\d$
Billy Jo

2
Działa również dobrze w C #.
Richard Ev

10
@SergO nie powinno być ^ (0 [0-9] | 1 [0-9] | 2 [0-3]): [0-5] [0-9] $?
Martin

57

Wyrażenia regularne dotyczące czasu

  • HH: MM 12-godzinny format, opcjonalnie z początkiem 0

    /^(0?[1-9]|1[0-2]):[0-5][0-9]\d$/
  • HH: MM 12-godzinny format, opcjonalne 0 wiodące, obowiązkowe południki (AM / PM)

    /((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
  • HH: MM 24-godzinne z początkowym 0

    /^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
  • HH: MM format 24-godzinny, opcjonalnie z początkiem 0

    /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
  • HH: MM: SS Format 24-godzinny z początkowym 0

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

Referencje i demo


4
Dziękuję Ci! Ta odpowiedź powinna być na górze.
Marc

Czy jest jakiś powód HH: MM 24-godzinne z początkowym 0 nie jest ^([0-2][0-3]|[0-1][0-9]):[0-5][0-9]+$?
Macovei Vlad

Ponieważ wyrażenie regularne w odpowiedzi działa dobrze. Ten, który skomentowałeś, też działa. Zapraszam do korzystania z jednego z nich. :)
Niket Pathak

W przypadku osób dopasowujących ciągi 12 godzin (z am / pm) do powyższego wyrażenia regularnego należy pamiętać, że testowanie „13:00” względem wyrażenia regularnego zwróci wartość true (niektóre wartości), ponieważ część „3:00 PM” w ciągu to ważny. Rozwiązałem problem, używając następującej instrukcji if let res = value.match (regex); if (res && res [0] === wartość) doSomething ();
Taha Rehman Siddiqui

49

Żadne z powyższych nie działało dla mnie. W końcu użyłem:

^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$ (js engine)

Logika:

Pierwsza liczba (godziny) to: liczba między 0 a 19 -> [0-1]?[0-9](dopuszczając liczbę jednocyfrową)
lub
liczba między 20 - 23 ->2[0-3]

druga liczba (minuty) to zawsze liczba z przedziału od 00 do 59 -> [0-5][0-9](nie dopuszczając jednej cyfry)


8
Nie potrzebujesz myślnika w pierwszym nawiasie kwadratowym, [01]działa równie dobrze;)
Czechnology

3
Oto poprawiona odpowiedź, która akceptuje tylko 12-godzinny czas (w tym opcjonalne zera wiodące):^(0?[1-9]|1[0-2]):[0-5][0-9]$
rgbflawed

^([0-1][0-9]|2[0-3]):[0-5][0-9]$wymusić wiodące zero
Manan Mehta

8

Możesz użyć tego 24H, sekundy są opcjonalne

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

4

Najlepiej byłoby, gdyby HH: MM nie podejmował żadnego ryzyka.

^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$

czy można to skrócić do ^([0-1]\d|2[0-3]):[0-5]\d$?
AlbinoDrought

3

O dziwo, okazało się, że w rzeczywistości wszystkie z nich nie do końca go pokrywają, ponieważ nie działają dla krótszego formatu o północy 0: 0, a kilka nie działa również dla 00:00, użyłem i przetestowałem następujące:

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

2

Możesz użyć tego wyrażenia regularnego:

^(2[0-3]|[01]?[0-9]):([1-5]{1}[0-9])$

Jeśli chcesz wykluczyć 00:00, możesz użyć tego wyrażenia

^(2[0-3]|[01]?[0-9]):(0[1-9]{1}|[1-5]{1}[0-9])$

Drugie wyrażenie jest lepszą opcją, ponieważ poprawny czas to 00:01 do 00:59 lub 0:01 do 23:59. Możesz użyć dowolnego z nich zgodnie z wymaganiami. Łącze Regex101


Pierwsze wyrażenie nie akceptuje 00:05 . Ale dzięki. Prowadzi mnie do walidacji, której szukałem.
JazZ

2

Mecze:

2: 9
2:09
2:59
02: 9
02:09
02:59
23:59

Użyj tego:

^([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9])$

jaki to czas 2: 9 czy 02: 9?
vs97

na przykład w C # jest tak wiele opcji konwersji obiektu DateTime na ciąg. DateTime date1 = new DateTime(2008, 1, 1, 6, 9, 1); Console.WriteLine(date1.ToString("H:mm:ss", CultureInfo.InvariantCulture)); // Displays 6:09:01 . aby uzyskać więcej informacji, zobacz link
Pedram Ahmadpour

1

Jak zapytałeś, najbardziej lewy jest nieco opcjonalny, ja zrobiłem najbardziej lewy i prawy również opcjonalny, sprawdź to

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

Pasuje do

0:0 
00:00
00:0 
0:00
23:59
01:00
00:59

Link na żywo jest dostępny tutaj


0

Możesz użyć następującego wyrażenia regularnego:

^[0-1][0-9]:[0-5][0-9]$|^[2][0-3]:[0-5][0-9]$|^[2][3]:[0][0]$

0

Ogłosić

private static final String TIME24HOURS_PATTERN = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";

public boolean validate(final String time) {
    pattern = Pattern.compile(TIME24HOURS_PATTERN);
    matcher = pattern.matcher(time);
    return matcher.matches();
}

Ta metoda zwraca wartość „true”, gdy ciąg znaków pasuje do wyrażenia regularnego.


0

Niewielka modyfikacja powyższego wkładu Manisha M Demblani dotyczy 4 rano (pozbyłem się sekcji sekund, ponieważ nie potrzebuję jej w mojej aplikacji)

^(([0-1]{0,1}[0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]))$

klamki: 4:00 4:00 4:00 4:00 16:00 4:30 itd.


1
AM|am|aM|Am|PM|pm|pM|Pm=[AaPp][Mm]
Ed Morton

0

Poniższe wyrażenie regularne pomoże zweryfikować format hh: mm

^([0-1][0-9]|2[0-3]):[0-5][0-9]$

-1

Mój jest:

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

To jest znacznie krótsze

Przetestowałem to na kilku przykładach

Mecz:

  • 00:00
  • 7:43
  • 07:43
  • 19:00
  • 18:23

I nie pasuje do żadnego nieprawidłowego wystąpienia, takiego jak 25:76 itp.


09:30nie pasują
Green

Twoje własne przykłady 00:00 i 07:43 nie pasują.
Christiaan Westerbeek,

-1

Możesz spróbować następujących rzeczy

^\d{1,2}([:.]?\d{1,2})?([ ]?[a|p]m)?$

Potrafi wykryć następujące wzorce:

2300 
23:00 
4 am 
4am 
4pm 
4 pm
04:30pm 
04:30 pm 
4:30pm 
4:30 pm
04.30pm
04.30 pm
4.30pm
4.30 pm
23:59 
0000 
00:00

-1

sprawdź to wzorcowe wyrażenie regularne do wykrywania znaczników czasu, które zbudowałem, aby szukać znacznika czasu określonego przez użytkownika, przykłady tego, co będzie przechwytywać, ale z całą pewnością NIE jest ograniczone;

8:30-9:40
09:40-09 : 50
09 : 40-09 : 50
09:40 - 09 : 50
08:00to05:00
08 : 00to05 : 00
08:00 to 05:00
8am-09pm
08h00 till 17h00
8pm-5am
08h00,21h00
06pm untill 9am

Odbierze również znacznie więcej, o ile podane czasy zawierają cyfry


1
RegExr requires a modern browser. Please update your browser to the latest version and try again.... Nawet tego nie widzę ...: - /
Martin Tournoij

-3

Spróbuj wykonać następujące czynności

^([0-2][0-3]:[0-5][0-9])|(0?[0-9]:[0-5][0-9])$

Uwaga: przyjąłem silnik regex javascript. Jeśli różni się od tego, daj mi znać.


-3

Możesz użyć następującego wyrażenia regularnego:

^[0-2]?[0-3]:[0-5][0-9]$

Jedynie dokonana przeze mnie modyfikacja jest opcjonalna. Reszta wyrażenia regularnego jest taka sama.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.