2009-03-21 4 views

Répondre

0

Probablement, mais les choses de l'année bissextile vont être très difficiles, donc vous pouvez vouloir aller avec autre chose qu'un Regex.

8

Il est possible de le faire avec une expression régulière, mais il serait incroyablement complexe. Je suis assez à l'aise pour écrire des expressions régulières, mais je n'utiliserais pas cette solution pour valider les dates.

Il est beaucoup plus simple d'utiliser une autre solution pour la validation des dates. Des composants de validation de date sont disponibles pour chaque langage de programmation. Je ne suis pas un utilisateur de .NET, mais avec une recherche rapide, je trouve la classe DateTime, qui semble faire cela.

Voir Guide du développeur .NET Framework, "Parsing Date and Time Strings."

+0

Je suis également très à l'aise avec les expressions régulières et je les aime énormément. Cependant, ils ne sont pas toujours le bon outil pour le travail. La suggestion de Bill Karwin est beaucoup plus appropriée pour cette tâche que les expressions régulières. – Dinah

+0

+1. Ecrire votre propre regex pour les dates serait l'esprit bogglingly ennuyeux. Il vaut mieux utiliser DateTime avec les options de localisation intégrées. –

3

Oui, il est possible, mais il obtient assez long. Le modèle juste pour vérifier les mois et les jours a quelques variations, et tout doit être répété pour les années bissextiles.

À titre d'exemple, voici un modèle de Michael Ash's Regex Blog pour le format mm/jj/aaaa:

^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)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})$ 
+0

Blog de Yay Regex! aka Le Daily Argh-My-Eyes! – bobince

7

Comme d'autres l'ont dit, une expression régulière n'est pas la meilleure approche à moins que vous êtes obligé (par exemple pour raisons JavaScript côté client).

Je vous suggère d'utiliser DateTime.TryParseExact avec un motif de "aaaa/MM/dd".

2

Il est possible de le faire. Il est même possible de faire cela pour les années bissextiles, mais ce serait complexe.

Une simple expression pour ce format de date:

^\d{4}/\d{2}/\d{2}$ 

Une expression plus complexe qui tient compte du nombre de jours par mois (mais le Feburary permet encore 29 jours chaque année):

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

Mais il serait probablement plus facile de le faire avec une fonction C# intégrée.