Accueil > > > TEST SI UNE DATE AU FORMAT FRANÇAIS EST VALIDE
TEST SI UNE DATE AU FORMAT FRANÇAIS EST VALIDE
Information sur la source
Description
Bon, c'est un cas extrême d'utilisation d'expression régulière. Plus un cas d'école, assez instructif, que quelque chose que j'utiliserai vraiment. Je prêche plutôt de scinder une chaîne complexe en parties plus simples et d'utiliser du code pour vérifier les parties (avec ou sans expression régulière !). Le but ici est de tester si une date du style jj/mm/aaaa est valide. Facile ? Pas si vous voulez rejeter les dates 29/02/2001 ou 31/11/2008... La validité se "limite" de 1600 à 2999. Pour être honnête, la base a été écrite par un certain dany.lauener(at)b-i.com. Elle faisait 281 caractères de long. Je l'ai améliorée un peu : analysée en code étendu commenté ci-dessous, puis simplifié à 233 caractères, pour la même fonctionnalité. J'espère qu'elle vous amusera, voire vous apprendra quelques astuces.
Source
- L'expression brute :
-
- ^((0[1-9]|1\d|2[0-8])/(0\d|1[012])/(1[6-9]|[2-9]\d)\d{2}|(29|30)/(0[13-9]|1[012])/(1[6-9]|[2-9]\d)\d{2}|31/(0[13578]|1[02])/(1[6-9]|[2-9]\d)\d{2}|29/02/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))$
-
- La même, décortiquée (option PCRE_EXTENDED par exemple : espaces non significatifs, le texte après # est du commentaire) :
-
- ^(
- # Jours 01 à 28, tous mois, toutes années : prend en compte rapidement les cas les plus courants
- ( # Jours 01 à 28
- 0[1-9]
- |
- 1\d
- |
- 2[0-8]
- )
- /
- ( # Mois (quelconques)
- 0\d
- |
- 1[012]
- )
- /
- ( # Années (n'importe lesquelles)
- 1[6-9] # 1600 à 1999
- |
- [2-9]\d # 2000 à 9999
- )\d{2} # N'importe quelle paire de chiffres
-
- |
-
- # Cas des mois avec 30 jours (ou moins)
- ( # 29 ou 30
- 29
- |
- 30
- )
- /
- ( # Mois avec 30 jours
- 0[13-9]
- |
- 1[012]
- )
- /
- (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
-
- |
-
- # Cas des mois avec 31 jours
- 31
- /
- ( # Mois où le 31 est valide
- 0[13578]
- |
- 1[02]
- )
- /
- (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
-
- |
-
- # Cas du 29 février
- 29/02/
- ( # Années
- (
- 1[6-9] # 1600 à 1999
- |
- [2-9]\d # 2000 à 9999
- )
- ( # Les deux derniers chiffres sont divisibles par 4
- 0[48]
- |
- [2468][048]
- |
- [13579][26]
- )
- |
- ( # Années valides finissant par un double zéro
- 16
- |
- [2468][048]
- |
- [3579][26]
- )00
- )
- )$
-
L'expression brute :
^((0[1-9]|1\d|2[0-8])/(0\d|1[012])/(1[6-9]|[2-9]\d)\d{2}|(29|30)/(0[13-9]|1[012])/(1[6-9]|[2-9]\d)\d{2}|31/(0[13578]|1[02])/(1[6-9]|[2-9]\d)\d{2}|29/02/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))$
La même, décortiquée (option PCRE_EXTENDED par exemple : espaces non significatifs, le texte après # est du commentaire) :
^(
# Jours 01 à 28, tous mois, toutes années : prend en compte rapidement les cas les plus courants
( # Jours 01 à 28
0[1-9]
|
1\d
|
2[0-8]
)
/
( # Mois (quelconques)
0\d
|
1[012]
)
/
( # Années (n'importe lesquelles)
1[6-9] # 1600 à 1999
|
[2-9]\d # 2000 à 9999
)\d{2} # N'importe quelle paire de chiffres
|
# Cas des mois avec 30 jours (ou moins)
( # 29 ou 30
29
|
30
)
/
( # Mois avec 30 jours
0[13-9]
|
1[012]
)
/
(1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
|
# Cas des mois avec 31 jours
31
/
( # Mois où le 31 est valide
0[13578]
|
1[02]
)
/
(1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
|
# Cas du 29 février
29/02/
( # Années
(
1[6-9] # 1600 à 1999
|
[2-9]\d # 2000 à 9999
)
( # Les deux derniers chiffres sont divisibles par 4
0[48]
|
[2468][048]
|
[13579][26]
)
|
( # Années valides finissant par un double zéro
16
|
[2468][048]
|
[3579][26]
)00
)
)$
Conclusion
Ça montre bien ce qu'il ne faut pas faire avec les expressions régulières ! En l'occurrence, écrire des expressions illisibles, trop complexes et difficilement maintenables... D'un autre côté, cela montre aussi qu'avec un peu d'analyse et de structuration, on peut quand même comprendre de telles expressions.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Recherche doublons (PCRE) [ par orax ]
Dans la chaine suivante : 12,55,4444,55,45,12,45,55,4444,12,55,44,4444,55,45,12,55,44,55,45,12,45,55,12,55,44,55,45 je veux qu'il trouve tous les doub
|
Derniers Blogs
[POWERSHELL 3] TéLéCHARGER ET INSTALLER LA DOCUMENTATION EN LIGNE[POWERSHELL 3] TéLéCHARGER ET INSTALLER LA DOCUMENTATION EN LIGNE par Pierrick CATRO-BROUILLET
Les fans de PowerShell et d'avance de phase auront surement eu le même problème que moi : la beta de PowerShell v3 n'a pas de documentation en local. Certes, on peut appeler Get-Help (je préfère "man") sur une commandlet pour avoir la liste de ses par...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET JOB DAY @MIC BRUSSELS - .NET DEVELOPERS ON MOBILE APPLICATIONSJOB DAY @MIC BRUSSELS - .NET DEVELOPERS ON MOBILE APPLICATIONS par junarnoalg
Vous recherchez des développeurs .NET spécialisés dans les applications mobiles - pour un stage, un FPIE, ou un emploi ? Afin de vous soutenir dans vos défis de recrutement, nous vous invitons à venir participer au « Job Day @MIC Brussels », qui...
Cliquez pour lire la suite de l'article par junarnoalg [SHAREPOINT 2010] - SHAREPOINT 2010, WINDOWS (SERVER) 8 ET DES ERREURS IIS SONT DANS UNE VM.[SHAREPOINT 2010] - SHAREPOINT 2010, WINDOWS (SERVER) 8 ET DES ERREURS IIS SONT DANS UNE VM. par Pierrick CATRO-BROUILLET
Je me suis récemment fait une VM de test avec Windows Server 8 Beta, Visual Studio 11, SQL Server 2012 et SharePoint 2010. Outre les difficultés d'installation de SharePoint (j'utilise essentiellement PowerShell avec le très bon http://autospinstaller...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET [EVENT] WINDOWS AZURE DEV CAMP LE 20 JUIN![EVENT] WINDOWS AZURE DEV CAMP LE 20 JUIN! par fathi
Si vous avez un peu de temps et que vous souhaitez vous mettre à Azure, MS organise un dev Camp le 20 juin à Issy les Molineaux: Au programme: · Présentations et démos exclusives des nouveautés de la plateforme · Échanges avec des membres de l'éq...
Cliquez pour lire la suite de l'article par fathi
Forum
JAVACCJAVACC par VerInfo
Cliquez pour lire la suite par VerInfo
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|