IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Comment rendre ses expressions rationnelles lisibles et maintenables [FAQ]


Sujet :

Java

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    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++

Discussions similaires

  1. Faut-il commenter son code source pour le rendre plus lisible et maintenable ?
    Par mayayu dans le forum Débats sur le développement - Le Best Of
    Réponses: 149
    Dernier message: 09/11/2009, 02h30
  2. Réponses: 1
    Dernier message: 19/06/2009, 13h41
  3. Comment rendre transparent le tour d un icone
    Par NeoRonin dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/03/2003, 01h40
  4. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo