Expression régulière pour contrôler une date

Mehdi -  
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,


Je recherche désespérément une expression régulière qui me permettrait de valider 4 formats de date:
DD/MM/YYYY
DD/MM/YYYY hh:mm:ss
MM/DD/YYYY
MM/DD/YYYY hh:mm:ss

J'aurais besoin d'une seule expression régulière, pas de 4.

Merci pour toute aide.

1 réponse

[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut Mehdi,

Cela :

(\d{2}\/\d{2}\/\d{4}){1}(\s\d{2}:\d{2}:\d{2})?

Mais l'expression ne vérifie pas si les jours, mois, années (ou heure, d'ailleurs), correspondent à des nombres cohérents.

Par exemple, les entrées suivantes matchent :

99/99/9999   
99/99/9999 99:99:99

Donc les cas 1 et 3 et 2 et 4 sont traités indifféremment.


Dal
0
KX Messages postés 19031 Statut Modérateur 3 020
 
De toute façon les cas particuliers sont tellement nombreux qu'une expression régulière qui les vérifierait tous serait monstrueusement longue, et certainement moins efficace que quelques if...

En plus autoriser à la fois DD/MM et MM/DD est ambigu !
Exemple : "06/07/2012" peut être à la fois le 6 juillet et le 7 juin 2012...
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut KX,

Oui, bien sûr, tu as raison.

Ce que je veux dire, comme il a spécifié une validation de "DD/MM/YYYY " et "MM/DD/YYYY ", c'est que la regexp ne fait pas de distinction dans l'exemple donné.

S'il veut vérifier que les jours, mois, années (ou heure, d'ailleurs), correspondent à des nombres cohérents il doit faire autrement (ou complexifier énormément la regexp, comme tu le dis).

A mon sens, s'il faut faire cette vérification, le plus simple serait de tenter de traduire la chaîne validée en une date, avec une fonction ad hoc de son langage de programmation qui fasse déjà cela, et de vérifier que la traduction s'est bien passée. On ne sait pas quel langage de programmation il utilise, mais, au hasard, si c'est Php, ou pourrait capturer les jours, mois, année, heures, minutes et secondes avec la regexp et les passer à mktime() et vérifier la valeur de retour. Des fonctions similaires existent dans d'autres langages.

Et sa validation tient en 2 lignes de code grâce à la regexp qui fera le travail de capture (il faut rajouter les parenthèses de capture à celle proposée ci-dessus) avec un seul if testant la valeur de retour de la fonction.

En plus autoriser à la fois DD/MM et MM/DD est ambigu !

Oui, il faudra bien qu'il choisisse s'il veut pousser la vérification.


Dal
0