Muszę zweryfikować ciąg daty dla formatu dd/mm/yyyy
za pomocą wyrażenia regularnego.
To wyrażenie regularne sprawdza poprawność dd/mm/yyyy
, ale nie dotyczy nieprawidłowych dat, takich jak 31/02/4500
:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
Jakie jest prawidłowe wyrażenie regularne do walidacji dd/mm/yyyy
formatu z obsługą roku przestępnego?
pattern
który przyjmuje wyrażenie regularne, a przeglądarki automatycznie sprawdzają poprawność względem wyrażenia regularnego bez użycia javascript. Wystarczy ustawić wyrażenie regularne w atrybucie wzorca!Odpowiedzi:
Wklejone wyrażenie regularne nie weryfikuje poprawnie lat przestępnych, ale jest taki, który to robi w tym samym poście . Zmodyfikowałem go, aby wziąć
dd/mm/yyyy
,dd-mm-yyyy
lubdd.mm.yyyy
.^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
Przetestowałem to trochę w linku podanym przez Arun w jego odpowiedzi, a także tutaj i wydaje się, że działa.
Edycja 14 lutego 2019 r .: Usunąłem przecinek z wyrażenia regularnego, który dopuszczał daty, takie jak
29-0,-11
źródło
DD/MM/YYYY
tym to wyrażenie regularne również akceptuje,DD/MM/YY
co nie jestem pewien, czy było to w pierwotnym zamiarze plakatu. Jeśli nie chcesz obsługiwać „YY”, usuń wszystkie opcjonalne?
kwantyfikatory.0?
z0
, a także usunąć ostatnie wystąpienie?
.?
, które powinny być usunięte: zastąpienie wszystkich(?:1[6-9]|[2-9]\d)?
z(?:1[6-9]|[2-9]\d)
.Rozszerzyłem wyrażenie regularne podane przez @Ofir Luzon dla formatów dd-mmm-RRRR, dd / mmm / RRRR, dd.mmm.RRRR zgodnie z moimi wymaganiami. Każdy, kto ma takie same wymagania, może to skierować
i przetestowane pod kątem niektórych przypadków testowych tutaj http://regexr.com/39tr1 .
Aby lepiej zrozumieć to wyrażenie regularne, odnieś się do tego obrazu:
źródło
8888
to możliwy rok. Spodziewam się żyć mniej więcej w tym wieku.Ogłoszenie:
Więc działa poprawnie tylko dla [1901 - 2099] (Whew) 😊
Dd / mm / rrrr:
Sprawdza rok przestępny. Lata od 1900 do 9999 są ważne. Tylko dd / MM / rrrr
źródło
29/02/2100
nie istnieje (rok 2100 NIE jest rokiem przestępnym), ale nadal jest akceptowany przez podany wzorzec.Spróbuj tego.
możesz łatwo przetestować wyrażenia regularne pod adresem http://www.regular-expressions.info/javascriptexample.html .
źródło
30-02-2001
... w każdym razie dzięki za odpowiedź :)Podejrzewam, że poniższe informacje są tak dokładne, jak można się spodziewać, nie wiedząc, kiedy użytkownik przełączył się z kalendarza juliańskiego na gregoriański.
Akceptuje „-”, „/” lub nic jako separatory między rokiem, miesiącem i dniem, bez względu na kolejność.
MMddyyyy:
Dd / mm / rrrr:
rrrrMMdd:
Poza porządkiem wszystkie są zgodne z kalendarzem juliańskim (rok przestępny co cztery lata) aż do 1700 roku, kiedy to kalendarz gregoriański odbiega od juliańskiego. Ma dwa problemy:
Zostało to przetestowane w porównaniu z implementacją kalendarza Javy od roku 0001 do roku 9999, z jedyną rozbieżnością, która dotyczy wspomnianych powyżej 10 dni w 1582 roku.
źródło
^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048])00)[-/]?02[-/]?29)$
. Testowane w Pythonie: repl.it/repls/DependentBestChaptersDla tych, którzy na to patrzą i są całkowicie zdezorientowani, oto fragment mojego scenariusza. Niestety, wszystko, co robi, to dopasowywanie prawidłowych liczb w danych wejściowych daty i czasu, a 31 lutego zostanie oznaczony jako prawidłowy, ale jak wielu powiedziało, regex naprawdę nie jest najlepszym narzędziem do wykonania tego testu.
Aby dopasować datę w formacie „rrrr-MM-dd gg: mm” (lub w dowolnej kolejności)
Powyższy skrypt zaczyna się od zbudowania obiektu regex. Następnie znajduje wszystkie wejścia, których identyfikator pasuje do określonego wzorca, a następnie przechodzi przez nie. Nie testuję pierwszego znalezionego wejścia (
if (e > 0)
).Trochę wyjaśnienia:
^
oznacza początek meczu, natomiast$
oznacza koniec meczu.\d+
oznacza dopasowanie pojedynczej lub ciągłej sekwencji liczb całkowitych, więcmyhtml_element_with_id_56_datetime
imyhtml_element_with_id_2_datetime
będzie pasować, alemyhtml_element_with_id_5a_datetime
nie będzieźródło
Oto kolejna wersja wyrażenia regularnego, która pasuje do dowolnego z następujących formatów daty i umożliwia pominięcie zer wiodących:
Regex:
^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$
Mecze:
1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true
Debuggex Demo
źródło
13/13/2000
= Mecze jest prawdziweTutaj napisałem jeden, dla
dd/mm/yyyy
którego separatorem może być-.,/
przedział roku0000-9999
.Zajmuje się latami przestępnymi i jest przeznaczony dla odmian wyrażeń regularnych, które obsługują lookaheads, przechwytywanie grup i odwołań wstecznych. NIE dotyczy takich jak
d/m/yyyy
. W razie potrzeby dodaj kolejne separatory do[-.,/]
Testuj przy regex101 ; jako ciąg Java:
wyjaśnione:
Zobacz także SO Regex FAQ ; Daj mi znać, jeśli to się nie powiedzie.
źródło
Znalazłem ten rejestr tutaj
To sprawdza poprawność formatu
mm/dd/yyyy
i poprawnych dat (ale niem/d/yyyy
).Kilka testów
źródło
zweryfikuje każdą datę pomiędzy
1900-2099
źródło
Poniższe wyrażenie jest przyjemne i łatwe do manipulowania:
Sprawdza zgodnie z formatem MM / dd / RRRR i umożliwia obsługę lat przestępnych od 1960 do 2016. Jeśli potrzebujesz przedłużenia obsługi lat przestępnych, wystarczy manipulować tą częścią wyrażenia:
Mam nadzieję, że to ci bardzo pomogło
źródło
Inna odpowiedź, która waliduje dzień (dd) w zależności od miesiąca (mm) i roku (rrrr) (tj. Również waliduje 29 lutego w latach przestępnych) i dopuszcza lata od 0001 do 9999 (0000 w roku nieważnym według gregoriańskiego kalendarz)
źródło
Pracuję z interfejsem API, który akceptuje tylko format MM / DD / RRRR. Nie mogłem znaleźć żadnego innego postu, który zrobiłby lata przestępne tak dobrze, jak odpowiedź Ofira , więc poprawiłem go i ponownie publikuję tutaj dla każdego, kto może go potrzebować.
źródło
potwierdzi
MM/DD/YYYY
format za pomocą1960
do2028
jeśli chcesz przedłużyć obsługę roku przestępnego, dodaj
to też jest praca
jeśli możesz zmienić format
mm-dd-yyyy
niż wymienić,[/]
aby[-]
sprawdzić również online http://regexr.com/źródło
Dla daty MM / DD / RRRR możesz użyć
Weryfikuje właściwe dni i miesiące.
Pamiętaj, że możesz sprawdzić swoje wyrażenie regularne pod adresem
regex101
co polecam :)
Baw się dobrze!
źródło
to wyrażenie regularne zweryfikuje daty w formacie:
12-30-2016 (mm-dd-rrrr) lub 12-3-2016 (mm-d-rrrr) lub 1-3-2016 (md-rrrr) lub 1-30-2016 (m-dd-rrrr)
źródło
Wiem, że to styczna odpowiedź na pytanie, ale jeśli chodzi o intencję pytania jest `` jak sprawdzić datę? '', To dlaczego nie spróbować pozwolić językowi programowania wykonać całej ciężkiej pracy (jeśli używasz języka, który mogą)?
np. w php
źródło