Le blog Eurelis

Expressions Régulières

Publication : 26 janvier 2010

Ce qu'il faut savoir pour s'en sortir...

Actualité Technique

Définition : C'est une chaîne de caractères qui permet de décrire un modèle (ou pattern) de chaîne de caractères. Ce modèle est décrit à l'aide d'opérateurs, de valeurs et de variables. Des options sont disponibles pour simplifier l'écriture de la REGEX.


 

Intérêt :
MATCH : A vérifier qu'une chaîne de caractères vérifie un pattern donné : la REGEX (Est-ce que ma chaîne commence / finit par … , contient / ne contient pas …, correspond à une adresse e-mail / web … ?)
EXTRACT : A extraire une partie d'une chaîne de caractère : un groupe (Je veux les paramètres param1 et param3 de l'URL … parser une page web …)
SUBSTITUTE : A remplacer une partie d'une chaîne de caractères par une autre (Modifier massivement le format d'un fichier CSV, SQL … Transformer un CSV en SQL…)


 

Syntaxe :

Caractères simples :

  • x satisait le caractère x
  • \t satisait le caractère « tabulation »
  • \n satisait le caractère « nouvelle ligne »
  • \r satisait le caractère « retour charriot »


Caractères de limite :

  • ^ caractérise le début de la ligne quand il est au début de l'expression régulière
  • $ caractérise la fin de la ligne quand il est à la fin de l'expression régulière
  • \b caractérise une coupure de mot (des caractères au début ou à la fin d'un mot)
    • \beur satisfait eurelis mais pas agitateur(mot qui commence par eur)
    • eur\b satisfait agitateur mais pas eurelis(mot qui finit par eur)
  • \B caractérise les caractères à l'intérieur d'un mot (ni au début, ni à la fin)
    • \Bi satisfait git et ci (mot qui ne commence pas par i)
    • i\B satisfait git mais pas ci (mot qui ne finit pas par i)


Classes de caractères :

  • Classes simples
    • [abc] satisfait a, b ou c. Equivalent à a|b|c
  • Négation
    • [^abc] satisfait tout sauf a, b ou c
  • Intervalle
    • [a-z] satisfait tous les caractères de a à z
    • [A-Z0-9] satisfait tous les caractères de A à Z et de 0 à 9
  • Union
    • [a-d[c-p]] est l'équivalent de [a-p]
  • Intersection
    • [b-p&&[a-d]] est l'équivalent de [b-d]
  • Soustraction
    • [a-z&&[^bc]] est l'équivalent de [ad-z]
    • [a-z&&[^m-p]] est l'équivalent de [a-lq-z]

Classes abrégées :

  • . satisfait tous les caractères
  • \d est un chiffre ("digit"). Equivalent à [0-9]
  • \D est un non-numérique. Equivalent à [^0-9] ou [^\d]
  • \s est un espacement ("whitespace"). Equivalent à [ \t\n\f\r]
  • \S est un non-espacement. Equivalent à [^\s]
  • \w est un alphanumérique ("word"). Equivalent à [a-zA-Z_0-9]
  • \W est un non-alphanumérique. Equivalent à [^\w]

Opérateurs logiques :

  • XY satisfait le caractère X suivi du caractère Y
  • X|Y satisfait le caractère X ou le caractère Y
  • (?:X) satisfait une chaîne contenant X (sans capturer X)
  • X(?!Y) satisfait une chaîne contenant X non-suivi de Y (sans capturer Y)

Groupes :
Un groupe permet de définir un sous-motif dans une expression régulière.

  • capturer le caractère X :(X)
  • récupérer le nième groupe capturé en référence arrière (dans la regex): \n
  • récupérer le nième groupe capturé en substitution (hors de la regex): $n

Conseil: toujours suivre l'ordre des parenthèses ouvrantes

Drapeaux :
Les drapeaux sont les options de l'expression régulière.

  • c : au cas où une erreur survient, ne pas réinitialiser la position de la recherche
  • g : rechercher globalement, c'est-à-dire trouver toutes les occurrences
  • i : ignorer la casse
  • m : multiple lines, la chaîne de caractères peut comporter plusieurs lignes
  • o : once, n'appliquer le modèle de recherche qu'une seule fois
  • s : single line, considérer la chaîne de caractères comme une ligne distincte
  • x : extended, utiliser la syntaxe étendue

Quantificateurs :
 

  • Quantificateurs gourmands ou avides (greedy) : cherchent le nombre maximal de répétitions qui autorisent le succès de la recherche.
    • X? satisfait le caractère X, 0 ou 1 fois
    • X* satisfait le caractère X, 0 ou plusieurs fois
    • X+ satisfait le caractère X, 1 ou plusieurs fois. Equivalent à XX*
    • X{n} satisfait le caractère X, exactement n fois
    • X{n,} satisfait le caractère X, au moins n fois
    • X{n,p} satisfait le caractère X, au moins n fois, mais pas plus de p fois
  • Quantificateurs réticents ou paresseux (reluctant) : cherchent le nombre minimal de répétitions qui autorisent le succès de la recherche
    • C'est l'exacte même syntaxe que les quantificateurs « gourmands » à laquelle on ajoute ?
  • Quantificateurs possessifs (possessive): cherchent le nombre maximal de répétition mais sans assurer le succès de la recherche (sans regarder si la suite de l'expression est satisfaite dans la chaîne)
    • C'est l'exacte même syntaxe que les quantificateurs « gourmands » à laquelle on ajoute +


 

 

Exemples à réutiliser :

  • Code Postal en France
    • \b[0-9]{5}\b
  • Numéro de téléphone en France
    • \b0[1-689]([-. ]?\d{2}){4}\b
  • Adresse E-mail
    • \b[\w.%+-]+@[a-zA-Z\d.-]+\.[A-Za-z]{2,4}\b
  • URL
    • \b[a-zA-Z\d]+://(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?\b
  • Adresse IP v4
    • \b((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}25[0-5]|(2[0-4]\d|[01]?\d{1,2})\b


 

 

Conclusion :
Une bonne expression régulière est une expression régulière:
Concise : Ecrire le strict minimum pour que cette expression régulière soit nécessaire et suffisante.
Claire : Être capable de comprendre facilement cette expression régulière, même en la regardant longtemps après.
Qui correspond précisément au besoin :Bien définir le besoin (les règles), pas d'erreur possible en fonction de différentes chaînes de caractères en entrée.


 

Bibliographie :
 

 

Antoine