Validation d'une date entre le 01/01/1600 et 31/12/2699) avec une expression régulière en c#. la validation tient compte des

Soyez le premier à donner votre avis sur cette source.

Vue 6 671 fois - Téléchargée 575 fois

Description

Expression réguliere en C# pour vérifier une date sous la forme dd/mm/ssyy.
Les dates peuvent être comprise en 01/01/1600 et 31/12/2699
L'expression régulière tient compte des années bissextiles 1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600
Les dates peuvent avoir ou non un séparateur (25/2/60 ou 250260)

3 goupes (dd, mm, ssyy) sont renvoyés si la date est valide
dd = jour
mm = mois
ssyy année

Le plus de l'expression régulière, c'est que le format de la date , n'est pas fixe comme avec un DateTime.ParseExact.
Par exemple, les dates 250260, 25:2:1960, 1-2-60 sont accpetées. Pour valider une date saisie à l'écran, c'est beaucoup plus simple

Source / Exemple :


...
            // expresionn régulière pour les dates sous la forme dd/mm/ssyy
            // c'est la seule ligne utile pour la validation.
            // utilisation:
            // if (regexDate.Match("25/2/60").Success == true)
            // {
            //    // code si la date est OK
            // }
            // else
            // {
            //    // code si la date est KO
            //}
            //
            System.Text.RegularExpressions.Regex regexDate = new System.Text.RegularExpressions.Regex(@"^((((?<dd>([012]?\d)|(3[01]))[\-/.: ]?)(?<mm>(0?[13578])|(1[02]))|((?<dd>([012]?\d)|30)[\-/.: ]?)(?<mm>(0?[469])|11))[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>([01]?\d)|(2[0-8]))[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>(1[6-9]|2[0-6])?\d\d)|(?<dd>29)[\-/.: ]?(?<mm>0?2)[\-/.: ]?(?<ssyy>((16|20|24)?(([13579][26])|([02468][048]))|((1[789]|2[12356])?(([13579][26])|([2468][048])|(0[48]))))))$");

            // *********************************************************************************
            // Génération de date et test 
            // *********************************************************************************

            // match pour tester la validitée et recupérer les groupes (dd, mm, ssyyy)
            System.Text.RegularExpressions.Match matchDate;

            // jours 'spéciaux' pour les test des dates
            Int16[] dayArray = new Int16[] { 1, 28, 29, 30, 31 };

            // date pour les tests
            String date;

            // tous les 100 ans depuis 1600 jusqu'à 2600
            for (Int16 yy = 1600, counter = 0; yy <= 2600; yy += 100)
            {
                // tous les mois
                for (Int16 mm = 1; mm <= 12; mm++)
                {
                    // tous les jours 'spéciaux'
                    for (Int16 dd = 0; dd < dayArray.Length; dd++)
                    {
                        // une fois sur 2 format la date avec des zeros (01/01/2025)
                        if ((++counter & 1) == 1)
                        {
                            date = String.Format("{0}/{1}/{2}", dayArray[dd], mm, yy);
                        }
                        else
                        {
                            date = String.Format("{0:D2}/{1:D2}/{2:D4}", dayArray[dd], mm, yy);
                        }

                        matchDate = regexDate.Match(date);
                        if (matchDate.Success == true)
                        {
                            // date OK formatée à partir des groupes
                            System.Console.WriteLine("OK - {0:D3} {1}-{2}-{3}", counter, matchDate.Groups["dd"].Value, matchDate.Groups["mm"].Value, matchDate.Groups["ssyy"].Value);
                        }
                        else
                        {
                            // date en erreur
                            System.Console.WriteLine("     {0:D3} {1} <-- KO", counter, date);
                        }
                    }
                }
            }
...

Conclusion :


C'est vraiment super les expression régulières...
Une ligne pour la validation et 40 pour tester si l'expression régulière fonction.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 16 juillet 2004
Statut
Membre
Dernière intervention
22 mai 2012

Pour les infos sur les années bisextilles, allez voir le site http://support.microsoft.com/kb/214019/fr

L'xpression régulière traite 4 types de date
1 les dates 'normales'
2 les dates pour le mois de février 'normal'
3 les dates pour le mois de février bisextille
4 les siclès spéciaux

pour les dates 'normales' c'est relativement simple:
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
- les mois 1, 3, 5, 7, 8, 10, 13 ont 31 jours
- les mois 4, 6, 9, 11 ont 30 jours

pour les dates pour le mois de février 'normal':
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
- le mois de février 'normal' à 28 jours


pour les dates pour le mois de février bisextille:
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
les années bisextilles dans un siècle sont:
00, 04, 08, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96.
Si on regarde les derniers chiffres, il y a 0, 4, 8, 2, 6.
A partir de là, on peut faire deux groupes
0, 4, 8 et 2, 6
Les siècles bisextilles commence donc par 0 ou 2 ou 4 ou 6 ou 8 suivies de 0 ou 4 ou 8. Les autres années bisextilles commencent par 1 ou 3 ou 5 ou 7 ou 9 suivi de 2 ou 6.
Ce qui se traduit en expression régulière par ([2468][048])|([13579][26])

pour les siclès spéciaux:
°°°°°°°°°°°°°°°°°°°°°°°°°
Mais il faut tenir compte des sièclès spéciaux (1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600) qui ne sont pas bisextilles car ils ne sont pas divisible par 400.
Ce qui se traduit en expression régulière par (1[6-9]|2[0-6)\d\d

L'application de demo teste les dates entre le 01/01/1900 et 31/12/2999 pour 100 ans pour les jours 1, 28, 29, 30, 31.
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
2
salut,

'imbuvable' est peut être un peu sévère...

je pense que ça irait mieux si tu détaillais comment tu as construit ton expression régulière. (ta source d'info pour la construire)

tu pourrais aussi mettre quelques test sur des dates un peu particulières aussi pour voir qu'elle marche bien. par exemple en comparant avec le comparant avec le comportement du datetime du framework.

ceci dit ce code fait surement le boulot, donc pas de problème !
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
2
imbuvable :(

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.