Introduction Les expressions r�guli�res se rencontrent dans de nombreux �diteurs sophistiqu�s comme vi et emacs, dans les programmes grep/egrep, et dans les langages tels awk, perl et sed. Les expressions r�guli�res sont utilis�es pour les recherches et les modifications de texte contextuelles avanc�es. L'expression r�guli�re est une description formelle d'une forme � comparer � une cha�ne de caract�res. La premi�re fois que j'ai vu quelqu'un utiliser les expressions r�guli�res, j'ai �t� fascin�. Des �ditions de texte et des recherches qui auraient pris normalement plusieurs heures pouvaient �tre ex�cut�es en quelques secondes. Cependant, je ne comprenais pas un mot lorsque je voyais les expressions � l'�cran. Elles n'�taient qu'une �trange combinaison de points, barres, �toiles et autres caract�res. J'�tais n�anmoins d�termin� � percer le myst�re, et j'ai rapidement d�couvert que les expressions r�guli�res sont tr�s faciles � utiliser. Elles suivent quelques simples r�gles de syntaxe. Bien que les expressions r�guli�res soient tr�s r�pandues dans le monde Unix, il n'existe pas de "langage standard pour les expressions r�guli�res". Il existe plut�t quelques dialectes diff�rents. Par exemple, il existe deux programmes de recherche de cha�nes dans les fichiers: grep et egrep. Les deux utilisent les expressions r�guili�res, mais avec des possibilit�s l�g�rement diff�rentes. Perl dispose probablement du plus grand ensemble d'expressions r�guli�res. Heureusement, les principes sont toujours les m�mes. Une fois comprise l'id�e de base, il est ais� d'apprendre les d�tails des diff�rents dialectes. Cet article vous pr�sentera les principes de base, et vous pourrez vous r�f�rer au manuel des diff�rents programmes pour conna�tre en d�tail ses r�gles et possibilit�s particuli�res. Un exemple simple Supposons que vous ayez l'agenda d'une soci�t� sous la forme suivante: Phone Name ID ... ... 3412 Bob 123 3834 Jonny 333 1248 Kate 634 1423 Tony 567 2567 Peter 435 3567 Alice 535 1548 Kerry 534 ... La soci�t� comporte 500 personnes. Les donn�es sont conserv�es dans un simple fichier texte en ASCII. Supposons que le premier chiffre du num�ro de t�l�phone corresponde au b�timent o� le collaborateur travaille. Comment savoir qui travaille dans le b�timent 1? Les expressions r�guli�res permettent de trouver rapidement la r�ponse: grep '^1' phonelist.txt or egrep '^1' phonelist.txt or perl -ne 'print if (/^1/)' phonelist.txt En d'autres termes, cela signifie rechercher toutes les lignes qui commencent par un "1". le symb�le "^" peut �tre traduit par "d�but de ligne". Il force l'expression enti�re � correspondre seulement si "1" est le premier caract�re de la ligne.
La syntaxe Formes � caract�re unique La pierre angulaire d'une expression r�guli�re est la forme � caract�re unique. Elle ne correspond qu'� ce caract�re. Dans l'exemple pr�c�dent, le "1" est une forme � caract�re unique. Il ne correspond qu'� "1" dans le texte. Un autre exemple de formes � caract�re unique est: egrep 'Kerry' phonelist.txt Cette forme est compos�e de plusieurs formes � caract�re unique (les lettres K,e,r,r,y). Les caract�res peuvent �tre regroup�s dans un ensemble. L'ensemble est constitu� d'une liste de caract�res plac�e entre crochets. L'ensemble lui-m�me est une forme � caract�re unique, car il co�ncide � un unique caract�re du texte. Il suffit qu'un des caract�res de l'ensemble soit pr�sent dans le texte pour que la correspondance soit v�rifi�e. Par exemple: [abc] est une forme � caract�re unique qui correspond indiff�remment � l'un des caract�res a, b ou c. [ab0-9] est une forme � caract�re unique qui correspond aux caract�res a ou b ou un caract�re entre 0 et 9. [a-zA-Z0-9\-] cet ensemble correspond � un caract�re unique qui est soit une lettre minuscule ou majuscule, soit un chiffre, ou encore le signe moins. Essayons: egrep '^1[348]' phonelist.txt Cette recherche extrait les lignes du fichier qui commencent par 13, 14 ou 18. Nous venons de voir que pour la plupart, les caract�res ASCII ne correspondent qu'� eux-m�mes. N�anmois, certains ont une signification sp�ciale. Les crochets d�finissent un ensemble, le signe moins "-" d�termine une plage. Pour annuler le caract�re sp�cial d'un symb�le, il suffit de le faire pr�c�der d'une barre invers�e "\". C'est ce que nous avions dans l'exemple pr�c�dent. Dans certains dialectes, certaines s�quences de contr�le commencent par une barre invers�e, qu'il faut alors supprimer pour retrouver la signification normale. Le point est un caract�re sp�cial important. Il correspond � n'importe quel caract�re sauf le saut de ligne. Par exemple: grep '^.2' phonelist.txt or egrep '^.2' phonelist.txt Ces commandes donnent toutes les lignes dont le deuxi�me caract�re est "2", le premier caract�re �tant quelconque. Les ensembles peuvent �tre invers�s (n�gation) en indiquant "[^" � la place de "[" comme marque de d�but d'ensemble. Ainsi, le symb�le "^" ne signifie plus d�but de ligne, mais la combinaison "[^" indique ensemble invers�. [0-9] [^0-9] [^abc] .
est une forme � caract�re unique qui correspond aux chiffres entre z�ro et neuf. correspond � tout caract�re ne repr�sentant pas un chiffre. correspond � tout caract�re diff�rent de "a", de "b", et de "c". le point correspond � n'importe quel caract�re sauf le saut de ligne, il est donc �quivalent � "[^\n]" o� "\n" est le saut de ligne.
Pour trouver toutes les lignes ne commencant pas par "1", il faudrait �crire: grep '^[^1]' phonelist.txt
ou egrep '^[^1]' phonelist.txt Ancrages Nous avons vu que le symb�le "^" correspond � un d�but de ligne. Les ancrages sont des expressions r�guli�res sp�cialement pr�vues pour correspondre � une position dans le texte et non � un caract�re du texte. ^ correspond � un d�but de ligne $ correspond � une fin de ligne Pour retrouver les personnes ayant le matricule 567 dans votre agenda, vous pouvez utiliser: egrep '567$' phonelist.txt Cette commande donnera les lignes se terminant par 567. R�p�titions Il est possible de sp�cifier combien de fois une forme � caract�re unique doit se r�p�ter. Description grep egrep perl vi vim vile elvis emacs Z�ro ou plusieurs fois * * * * * * * * Une ou plusieurs fois \{1,\} + + \+ \+ \+ + Z�ro ou une fois \? ? ? \= \? \= ? Entre n et m fois \{n,m\} {n,m} \{n,m\} \{n,m\} Remarque: les diff�rentes variations de vi ont leur option magique positionn�e pour fonctionner comme indiqu�. Un exemple sur l'agenda t�l�phonique: .... 1248 Kate 634 .... 1548 Kerry 534 .... Pour retrouver une ligne qui commence par "1", puis au moins un chiffre, puis au moins un espace, enfin un nom commencant par "K", on pourrait �crire: grep '^1[0-9]\{1,\} \{1,\}K' phonelist.txt ou utiliser "*" et r�p�ter l'ensemble "[0-9]" et l'espace: grep '^1[0-9][0-9]* *K' phonelist.txt ou egrep '^1[0-9]+ +K' phonelist.txt ou perl -ne 'print if (/^1[0-9]+ +K/)' phonelist.txt Notez que la r�p�tition intervient sur la forme � caract�re unique pr�c�dente. Ainsi, "23*4" ne signifie PAS "2 puis 3 puis n'importe quoi puis 4" (cela s'�crirait "23.*4"), mais signifie "une fois 2, peut-�tre plusieurs fois 3, puis une fois 4". Il faut aussi remarquer que les r�p�titions sont gourmandes. C'est � dire que la premi�re r�p�tition dans la forme s'�tend le plus possible vers la droite du texte. Ainsi l'expression "^1.*4" renverrait la ligne suivante en entier: 1548 Kerry 534 depuis le premier caract�re jusqu'au dernier. Ca n'a pas d'incidence pour les outils comme grep, mais la diff�rence est importante pour les �ditions et les substitutions. M�morisation avec les parenth�ses La contruction de m�morisation avec les parenth�ses ne change pas la correspondance d'une expression mais permet de m�moriser le texte renvoy�, afin d'�tre utilis� plus loin dans l'expression. Le texte m�moris� est disponible � travers des variables. La premi�re parenth�se de l'expression est la variable une, la seconde parenth�se la variable deux, etc. Nom du programme Syntaxe des parenth�ses Syntaxe des variables
grep \(\) \1 egrep () \1 perl () \1 or ${1} vi,vim,vile,elvis \(\) \1 emacs \(\) \1 Par exemple, l'expression "[a-z][a-z]" renverrait deux lettres minuscules. On peut r�utiliser les deux caract�res renvoy�s afin de rechercher des formes comme 'otto': egrep '([a-z])([a-z])\2\1' La variable 1 contient le caract�re "o", la variable 2 le caract�re "t". Cette expression retrouverait aussi le texte "anna", mais pas "toto". Cette construction de m�morisation avec les parenth�ses n'est pas souvent utilis�e pour des recherches de texte comme otto ou anna, mais plut�t lors des �ditions ou pour des substitutions. Edition de texte avec les expressions r�guli�res Pour l'�dition, on peut utiliser un �diteur comme vi ou emacs, ou utiliser des outils ou langages comme perl. Dans emacs, la commande � ex�cuter est query-replace-regexp (demanderemplacement-expressions r�guli�res M-x), qui peut aussi �tre affect�e � une touche de fonction. Vous pouvez aussi utiliser la commande replace-regexp (remplacement-expressions r�guli�res). La premi�re commande est interactive, la seconde ne l'est pas. Dans vi, la commande de substitution est "%s/ / /gc". Le symb�le "%" fait r�f�rence � l'�tendue d'action de la commande (fichier complet), et peut �tre remplac� par n'importe quelle �tendue appropri�e. Par exemple, dans vim utilisez shift-v, marquez une �tendue puis ex�cutez la substitution sur cette �tendue. Je ne m'�tendrai pas plus sur vim, qui m�riterait un article � lui seul. Dans la commande de substitution, "gc" fait r�f�rence � la version interactive. La version sans confirmation est "s/ / /g". Interactif signifie ici demande de confirmation avant chaque remplacement. Avec perl vous pouvez utiliser: perl -pe 's/ / /g' Essayons quelques exemples. Supposons que le plan de num�rotation soit modifi�, et qu'on doive ins�rer un "2" apr�s le deuxi�me caract�re pour tous les num�ros commencant par "1". Par exemple, le num�ro 1423 devient 14223. Le r�pertoire t�l�phonique avant modification: Phone Name ID ... 3412 Bob 123 3834 Jonny 333 1248 Kate 634 1423 Tony 567 2567 Peter 435 3567 Alice 535 1548 Kerry 534 ... En ex�cutant l'une des commandes suivantes: vi: s/^\(1.\)/\12/g emacs: ^\(1.\) replaced by \12
perl: perl -pe 's/^(1.)/${1}2/g' phonelist.txt le r�pertoire devient: Phone Name ID ... 3412 Bob 123 3834 Jonny 333 12248 Kate 634 14223 Tony 567 2567 Peter 435 3567 Alice 535 15248 Kerry 534 ... Perl n'est pas limit� aux variables m�moires " \1" � "\9". Ainsi, "\12" ferait r�f�rence � la douzi�me variable m�moire, d'o� la syntaxe "${1}" pour r�f�rencer la premi�re variable m�moire. Vous remarquerez que l'alignement dans la liste est dor�navant perturb�. Comment rem�dier � ce probl�me? On peut tester si le caract�re en cinqui�me position est un espace, et sinon ajouter un espace: vi: s/^\(....\) /\1 /g emacs: '^\(....\) ' replaced by '\1 ' perl: perl -pe 's/^(....) /${1} /g' phonelist.txt Maintenant le r�pertoire a retrouv� un aspect plus agr�able: Phone Name ID ... 3412 Bob 123 3834 Jonny 333 12248 Kate 634 14223 Tony 567 2567 Peter 435 3567 Alice 535 15248 Kerry 534 ... Un coll�gue a manuellement �dit� le r�pertoire en introduisant accidentellement des espaces au d�but de certaines lignes. Comment les enlever? Phone Name ID ... 3412 Bob 123 3834 Jonny 333 12248 Kate 634 14223 Tony 567 2567 Peter 435 3567 Alice 535 15248 Kerry 534 ... Ces commandes devraient apporter la solution: vi: s/^ *// (il y a 2 espaces car nous n'avons pas le +) emacs: '^ +' remplac� par la cha�ne vide perl: perl -pe 's/^ +//' phonelist.txt Autre exemple pour les d�veloppeurs. Vous �crivez un programme qui comporte les deux variables "temp" et "temporaire". Maintenant vous souhaiteriez remplacer le nom de variable "temp" par "compteur". Si la cha�ne "temp" est simplement remplac�e par "compteur", alors l'autre variable prendra le nom "compteuroraire", ce qui n'est pas ce que vous souhaitez! Les expressions r�guli�res peuvent le faire. Remplacez simplement "temp([^o])" par "compteur\1". C'est � dire que l'on recherche maintenant la cha�ne "temp" puis n'importe quel caract�re diff�rent de "o". (Une solution alternative aurait �t� d'utiliser les limites, mais nous n'avons pas discut� ce type d'ancrage.)
J'esp�re que cet article aura suscit� votre int�r�t pour les expressions r�guli�res. Je vous conseille de jeter un oeil aux pages d'aide et � la documentation de votre �diteur favori pour plus de d�tail. Bien s�r cet article n'est qu'une br�ve introduction, il existe d'autres caract�res sp�ciaux, comme par exemple l'alt�ration (sorte de OU logique), et aussi les limites de mots �voqu�es pr�c�demment. Bonne �dition, amusez-vous bien!