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 ?

5voto

user3575114 Points 31
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"

validera toute date comprise entre 1900-2099

5voto

Chase Points 1

L'expression suivante est agréable et facile à manipuler :

((((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[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])))

Il valide selon le format MM/dd/YYYY et prend en charge les années bissextiles de 1960 à 2016. Si vous avez besoin d'étendre le support des années bissextiles, il vous suffit de manipuler cette partie de l'expression :

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

J'espère que cela vous a beaucoup aidé

2voto

sachin kumar Points 425

Selon moi, le meilleur moyen est d'utiliser la méthode isValid() de Moment.js en spécifiant le format et d'utiliser une analyse syntaxique stricte.

Comme le dit la documentation de moment.js

À partir de la version 2.3.0, vous pouvez spécifier un booléen pour le dernier argument pour que Moment utilise une analyse syntaxique stricte. L'analyse stricte exige que le format et l'entrée doivent correspondre exactement, y compris les délimiteurs.

value = '2020-05-25';
format = 'YYYY-MM-DD';
moment(value, format, true).isValid() // true

1voto

Daniel Points 342

Je travaille avec une API qui uniquement accepte le format MM/DD/YYYY. Je n'ai pas pu trouver d'autre poste qui gère les années bissextiles aussi bien que La réponse d'Ofir Je l'ai donc modifié et je le publie à nouveau ici pour ceux qui en auraient besoin.

/^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/

1voto

Rahul Points 149

Dans le cas où vous recherchez un format spécifique, cela fonctionne bien pour les formats de date "dd/MM/yyyy" et "dd/MMM/yyyy" uniquement sur la base de la réponse d'Alok.

function isValidDateFormatDDMMYYYY(inputDate) {
    var date_regex = /^(?:(?:31(\/)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/)(?:0?2|(?:Feb))\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]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
    return date_regex.test(inputDate);
}

Quelques exemples d'utilisation de ce code -

  • isValidDateFormatDDMMYYY("15/01/1999") // renvoie Vrai
  • isValidDateFormatDDMMYYYY("15/Jan/1999") // renvoie Vrai
  • isValidDateFormatDDMMYYY("15/1/1999") // renvoie Vrai
  • isValidDateFormatDDMMYYYY("1/15/1999") // renvoie Faux

Gracias

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