1 Expressions régulières/rationnelles 1.1 Introduction Les expressions rationnelles 1 sont des chaînes de caractères définissant des langages réguliers 2 et utilisés pour reconnaître des motifs. De nombreux outils et langages de programmation les utilisent pour des recherches et des modifications de texte contextuelles avancées : — Outils en ligne de commandes : grep, sed, awk, … — Langages de scripts : perl, php, python, … — Langages de programmation : java, c++, … — Éditeurs de texte : vi, emacs, jEdit, … — Traitements de texte : LibreOffice, … Il existe de nombreuses variantes et dialectes, cependant il est possible de distinguer deux grandes familles : — Expression régulière POSIX : l’objectif avec ce standard est de répondre à la problématique de la multiplication des syntaxe. — PCRE (Perl-Compatible Regular Expression) : Perl est un langage proposant nativement un traitement puissant des expressions régulière. L’ensemble de fonctionnalités disponible a été implémenté dans une bibliothèque à laquelle Il est possible de faire appel dans d’autre contextes. De manière transversale, les expressions régulières sont utilisées soit pour effectuer une recherche de motif, soit pour remplacer un motif par une chaîne de caractère. Les fonctions ont donc la forme suivante : — trouve(regex,texte) → booléen La fonction trouve retourne vrai si le motif regex se trouve dans la chaîne de caractères texte (il est alors possible de récupérer lla partie de la chaine reconnue par le motif). — remplace(regex,chaîne,texte) → chaîne de caractères La fonction remplace retourne une chaîne de caractères où les occurrences du motif regex dans la chaîne de caractères texte ont été remplacées par la chaîne. On trouve aussi dans les langages de programmation : — découpe(regex,texte) → tableau Cette fonction découpe la chaîne texte par rapport au motif regex, le résultat est stocké dans un tableau de chaîne de caractères. 1.2 Principe sous-jacent La reconnaissance de motif se fait à l’aide d’un diagramme de transition. Sa mise en œuvre se fait à l’aide d’automates finis déterministes (AFD) avec un état initial et un ou plusieurs états finaux. Le principe est le suivant : 1. l’état courant est l’état initial 1. Appelées au départ improprement expressions régulières le terme est entré dans le langage courant. 2. Il existe de nombreux langages, chacun avec leur spécificités et leurs limites. 1 2. lecture du caractère suivant dans la chaîne d’entrée 3. si il existe un chemin (arc) dont l’étiquette correspond au caractère alors changer l’état courant avec le nouvel état — si l’état courant est un état final alors le motif est reconnu 4. sinon l’état courant est l’état initial 5. retourner à l’étape 2 La figure 1 montre le déroulement du processus. L’état courant est en violet, les états finaux en gris. Le vert indique les parties de textes reconnues par le motif. 1.3 Syntaxe La syntaxe des expressions régulières s’exprime non pas sous formes de mots clefs mais à partir de caractères, par conséquent un certain nombre de ces caractères sont réservés car possédant un sens particulier : ( ) [ ] { } . *? + ^ $ | Le caractère \ permet de les dé-spécialiser (ainsi \* désigne le caractère étoile alors que * est un opérateur) ou d’accéder à des caractères non imprimables (par exemple la tabulation). Classe de caractères [aeiouy] reconnaît les voyelles [ˆaeiouy] reconnaît tous les caractères qui ne sont pas des voyelles : p. ex. 7 é n ; ’+ [0-9] reconnaît les chiffres [A-z] reconnaît tous les caractères entre A et z donc les caractères entre Z(90) et a(97) Classes prédéfinies \d ou [:digit:] tout caractère numérique : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 \w ou [:alnum:] (word metacharacter) une lettre [a-z] [A-Z], un chiffre [0-9] \s ou [:space:] (whitespace metacharacter) espace, tabulation, saut de ligne, ou tout autre caractère non imprimable \b (word boundary metacharacter) espace, ponctuation, le début du texte, la fin du texte Caractère quelconque . reconnaît n’importe quel caractère sauf fin de ligne \r et \n Début/fin de ligne Pour les outils en ligne de commande, l’unité pour la recherche de motif est la ligne, dans les langages de programmation, c’est la chaîne de caractère. ˆA reconnaît toutes les lignes / chaînes commençant par un A A$ reconnaît toutes les lignes / chaînes terminant par un A Choix | permet d’exprimer une alternative 2 7 x 8 7 u 0 c 1 h 2 e 3 v 4 a 5 0 l c 1 h 2 e 3 v 4 a 7 l x 1 h 2 e 3 v 4 a 7 0 c 1 h 2 e 3 v 4 a 7 l x 1 h 2 e 3 v 4 a 7 0 c 1 h 2 e 3 v 4 a 7 l x 1 h 2 e 3 v 4 a 7 0 c 1 h 2 e 3 v 4 a 7 l x 1 h 2 e 3 v 4 a 7 0 c 1 h 2 e 3 v 4 a 7 l x 1 h 2 e 3 v 4 a 7 x 8 u 5 0 l 6 le_chevalier_regarde_les_chevaux galoper 8 u c 8 5 6 le_chevalier_regarde_les_chevaux galoper 0 x u 5 l 6 le_chevalier regarde les chevaux galoper 8 u c 8 5 6 le_chevalier regarde les chevaux galoper 0 x u 5 l 6 le_chevalier regarde les chevaux galoper 8 u c 8 5 6 le_chevalier regarde les chevaux galoper 0 x u 5 l 6 le_chevalier regarde les chevaux galoper 8 u c 8 5 6 le_chevalier regarde les chevaux galoper 0 x u 5 l 6 le_chevalier regarde les chevaux galoper 8 u c 8 5 6 le chevalier regarde les chevaux galoper 0 x u c 1 h 2 e 3 v 4 a 5 l 6 le_chevalier_regarde_les_chevaux galoper le_chevalier_regarde_les_chevaux_galoper Figure 1 – Reconnaissance à partir de l’automate cheva(l|ux) Opérateurs de répétition Les opérateurs s’appliquent au caractère qui le précède. ? 0 ou 1 fois * 0 ou n fois + 1 ou n fois {n} exactement n fois 3 6 {n,} au moins n fois {,n} au plus n fois {n,m} au moins n fois à au plus m fois Par défaut les moteurs d’expressions régulières cherchent à maximiser le motif reconnu par une expression régulière L’ajout à l’opérateur du symbole ? permet au contraire de minimiser le motif reconnu Parenthèses : groupement et mémorisation Les parenthèse ont une double signification,elles permettent d’une part d’appliquer un opérateur sur plusieurs caractère, et d’autre part de mémoriser une partie les motifs reconnus afin de les réutiliser ultérieurement dans la partie remplacement. La référence aux parenthèses se fait par rapport à leur numéro d’ordre préfixé par $ ou par \\ 4