238 votes

Regex pour valider les formats de date dd/mm/YYYY, dd-mm-YYYY, dd.mm.YYY, dd mmm YYYY, dd-mmm-YYY, dd/mmm/YYYY, dd.mmm.YYY avec support des années bissextiles

J'ai besoin de valider une chaîne de date pour le format dd/mm/yyyy avec une expression régulière.

Cette regex valide dd/mm/yyyy mais pas les dates invalides comme 31/02/4500 :

^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$

Quelle est une regex valide pour valider dd/mm/yyyy avec prise en charge des années bissextiles ?

1voto

Shivam Bharadwaj Points 353
import re
expression = "Nov 05 20:10:09 2020"
reg_ex = r'((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-2][0-9]|(3)[0-1]) (([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])) (\d{4}))'
assert re.fullmatch(reg_ex, expression), True

Expansion par rapport à l'exemple donné

  • Nov \= A group of possible months i.e. (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
  • 05 \= A group of valid days i.e. ([0-2][0-9]|(3)[0-1])
  • 20:10:09 \= A group for getting valid Hours : ([0-1][0-9]|2[0-3]), Minutes : ([0-5][0-9]) and Seconds : ([0-5][0-9])
  • 2020 \= A group for getting year i.e (\d{4}))

1voto

Ghotekar Rahul Points 262

S'il vous plaît Expression suivante

Regex regex = new Regex(@"(((0|1)[0-9]|2[0-9]|3[0-1])\/(0[1-9]|1[0-2])\/((19|20)\d\d))$");

1voto

SeaBean Points 5872

Extension de la regex donnée par @AlokChaudhary pour le support :

1. dd mmm YYYY (en plus de dd-mmm-YYYY , dd/mmm/YYYY , dd.mmm.YYYY ).

2. mmm en lettres majuscules (en plus du format du titre)

dd mmm YYYY par exemple 30 Apr 2026 o 24 DEC 2028 sont populaires.

Regex étendu :

(^(?:(?:(?:31(?:(?:([-.\/])(?:0?[13578]|1[02])\1)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\2)))|(?:(?:29|30)(?:(?:([-.\/])(?:0?[13-9]|1[0-2])\3)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)\4))))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$|^(?:29(?:(?:([-.\/])(?:0?2)\5)|(?:([-.\/ ])(?:Feb|FEB)\6))(?:(?: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])))\7)|(?:([-.\/ ])(?:Jan|JAN|Feb|FEB|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\8))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$)

Les cas de test inclus dans le Démonstration de Regex

Caractéristiques (retenues) :

  • La vérification de l'année bissextile (validation du 29 février) comprend les logiques suivantes : (divisible par 4 mais non divisible par 100) ou (divisible par 400).
  • Supports années 1600 ~ 9999
  • Supports dd/mm/YYYY , dd-mm-YYYY , dd.mm.YYYY (mais pas dd mm YYYY )
  • Supports dd mmm YYYY , dd-mmm-YYYY , dd/mmm/YYYY , dd.mmm.YYYY ( dd mmm YYYY nouvellement ajouté. mmm peut être en majuscules, par exemple DEC, ou en format titre, par exemple Dec)

Quelques retouches mineures supplémentaires comme suit :

  1. Inclut le correctif apporté par Ofir Luzon le 14 février 2019 pour supprimer une virgule qui se trouvait dans la regex qui autorisait des dates comme 29-0,-11 [erreur répliquée dans la regex d'Alok Chaudhary].

  2. Remplacé (\/|-|\.) par ([-.\/]) pour minimiser l'utilisation de la barre oblique inversée. \/ est toujours utilisé afin de supporter certaines saveurs de regex, par exemple PCRE(PHP), bien que d'autres saveurs de regex, par exemple Python, puissent simplement utiliser / à l'intérieur de la classe de caractères [ ]

  3. Ajout d'une paire de parenthèses () entourant l'ensemble de la regex pour en faire un groupe de capture pour l'ensemble de la chaîne correspondante. Ceci est utile pour les personnes qui utilisent des fonctions de type findAll pour obtenir une liste d'éléments correspondants (par ex. re.findall en Python). Cela nous permet de capturer toutes les chaînes de caractères correspondantes dans une chaîne de caractères multiniveau avec les codes suivants :

re.findall codes d'échantillons :

match_list = re.findall(regex, source_string)
for item in match_list:
    print(item[0])

Image regex étendue : enter image description here

Les crédits devraient aller à Ofir Luzon et Alok Chaudhary qui ont créé des regex si excellents pour nous tous !

0voto

mahesh Points 7
((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

validera MM/DD/YYYY format avec 1960 a 2028

si vous avez besoin d'étendre le support des années bissextiles, ajoutez alors

19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))

c'est aussi un travail

^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

si vous pouvez changer de format mm-dd-yyyy que de remplacer [/] a [-] Vérifiez également en ligne http://regexr.com/

0voto

Pour la date MM/DD/YYYY vous pouvez utiliser

^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$

Il vérifie les jours et les mites appropriés.

N'oubliez pas que vous pouvez vérifier votre expression régulière à l'adresse suivante

regex101

que je recommande :)

Amusez-vous bien !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X