Regex horodatage ISO 8601
La réponse la plus votée (173 votes) sur la question de référence admet elle-même accepter « un 14e mois ». Une autre réponse, plus élaborée, exige des millisecondes sur exactement 3 chiffres et un fuseau « Z » uniquement — rejetant des horodatages ISO 8601 pourtant valides. Voici un motif qui borne réellement chaque composant, comparé aux tentatives réelles.
/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — commentaire de l'auteur de la question (mykhal), aucune plage vérifiée | ^(\d{4})-0?(\d+)-0?(\d+)[T ]0?(\d+):0?(\d+):0?(\d+)$ | 10 / 20 | sûr |
| Stack Overflow — réponse la plus votée, 173 votes (Brock Adams), admet accepter un « 14e mois » | ^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)$ | 12 / 20 | sûr |
| Stack Overflow — réponse à 14 votes (ferpel), jours par mois corrects mais ms/fuseau rigides | ^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z$ | 12 / 20 | sûr |
Implémentation
const re = new RegExp("^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", "");
re.test(input);Limites
- Ne valide pas la cohérence calendaire : « 2023-02-30 » (30 février) ou « 2023-04-31 » (31 avril) passent la vérification alors qu'ils n'existent pas. C'est un choix assumé, partagé par plusieurs réponses du fil source : encoder les jours par mois et les années bissextiles dans une regex la rend illisible pour un gain de fiabilité marginal face à un vrai parseur de date.
- N'accepte pas la 61e seconde (seconde intercalaire), pourtant valide dans la norme ISO 8601 — un détail signalé dans les commentaires du fil source et ignoré par la quasi-totalité des implémentations réelles.
- Exige un fuseau horaire explicite (« Z » ou décalage) : un horodatage local sans fuseau, bien que parfois toléré en pratique, n'est pas strictement conforme à ISO 8601 et est rejeté ici volontairement.
- Le nombre de chiffres des millisecondes n'est pas plafonné : une précision en microsecondes ou nanosecondes (6 ou 9 chiffres) passe aussi bien qu'une précision en millisecondes (3 chiffres).