Précédent   Forum du club des développeurs et IT Pro > Java > Communauté Java > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, et autres ressources pour la rubrique Java.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/12/2008, 14h40   #1
dingoth
Membre Expert
 
Inscription : mai 2004
Messages : 1 253
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 1 253
Points : 1 298
Points : 1 298
Par défaut [FAQ] Comment rendre ses expressions rationnelles lisibles et maintenables

Comment écrire plus facilement des expressions rationnelles (ou régulières)

Une expression rationnelle est souvent un truc (oui, truc) moche et complètement illisible. Pour pallier à cela, réfléchissez à la manière dont vous voulez construire une expression rationnelle. Et n'hésitez pas à la construire sur plusieurs lignes, et même de la documenter.

Pour ce faire, deux solutions existent : la première est de créer son expression comme une concaténation de plusieurs chaînes ; la seconde est l'utilisation du flag COMMENT (ou x, en perl).

Voyons voir une expression rationnelle qui à première vue est illisible :

Code :
Pattern regex = Pattern.compile("^((?:ht|f)tps?)://((?:\\p{Alpha}(?:-?\\w+)*\\.)*\\p{Alpha}\\w*|(?:\\d+\\.){3}\\d+)(?::(\\d{1,5}))?/");
La première solution serait de l'écrire comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Pattern regex = Pattern.compile(
   "^"                               // Début de ligne
 + "((?:ht|f)tps?)"                  // Récupération du protocole : http, https, ftp ou ftps, on oublie le groupe formé par ht|f.
 + "://"                             // séparateur protocole - hôte.
 + "("                               // Nous désirons capturer le nom d'hôte dans son intégralité.
   + "(?:\\p{Alpha}(?:-?\\w+)*\\.)*" // Un nom d'hôte est formé d'une lettre, suivi d'un tiret facultatif et pour chaque tiret, il doit être suivi d'un caractère autre qu'un tiret.
   + "\\p{Alpha}\\w*"                // La dernière partie du nom d'hôte ne peut comporter que des caractères alphanumériques, avec une lettre en première position.
 + "|"                               // ou alors une adresse IP
   + "(?:\d+\.){3}"                  // Une adresse IP v4 est formée de chiffres suivis d'un point, 3 fois
   + "\d+"                           // et se termine par des chiffres.
 + ")"                               // Fin de la capture du nom d'hôte.
 + "(?::(\d{1,5}))?"                 // S'il y a un port, on le récupère également dans son propre groupe. On évite soigneusement de récupérer le "deux-points".
 + "/"                               // Fin de l'expression rationnelle liée à une URL.
);
La deuxième solution est d'utiliser des commentaires directement dans l'expression.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Pattern regex = Pattern.compile("
  ^                                # Début de ligne
  ((?:ht|f)tps?)                   # Récupération du protocole : http, https, ftp ou ftps, on oublie le groupe formé par ht|f.
  ://                              # séparateur protocole - hôte.
  (                                # Nous désirons capturer le nom d'hôte dans son intégralité.
    (?:\\p{Alpha}(?:-?\\w+)*\\.)*  # Un nom d'hôte est formé d'une lettre, suivi d'un tiret facultatif et pour chaque tiret, il doit être suivi d'un caractère autre qu'un tiret.
    \p{Alpha}\w*                   # La dernière partie du nom d'hôte ne peut comporter que des caractères alphanumériques, avec une lettre en première position.
  |                                # ou alors une adresse IP
    (?:\d+\.){3}                   # Une adresse IP v4 est formée de chiffres suivis d'un point, 3 fois
    \d+                            # et se termine par des chiffres.
  )                                # Fin de la capture du nom d'hôte.
  (?::(\d{1,5}))?                  # S'il y a un port, on le récupère également dans son propre groupe. On évite soigneusement de récupérer le "deux-points".
  /                                # Fin de l'expression rationnelle liée à une URL.
", Pattern.COMMENT);
Comme vous pourrez le constater, les trois expressions présentées ici sont parfaitement identiques, mais les deux dernières sont bien plus lisibles.

Attention, certains EDI, dont Eclipse, ne supportent pas les les chaînes sur plusieurs lignes comme montrée dans le troisième exemple.
dingoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2008, 15h21   #2
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 661
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 661
Points : 22 460
Points : 22 460
Citation:
Envoyé par dingoth Voir le message
Attention, certains EDI, dont Eclipse, ne supportent pas les les chaînes sur plusieurs lignes comme montrée dans le troisième exemple.
Euh...
Sauf erreur c'est le langage tout court qui n'autorise pas cela !?
Tu as un EDI/compilateur qui accepte cela ???

a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web