Vous êtes sur la page 1sur 6

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] est une forme � caract�re unique qui correspond


aux chiffres entre z�ro et neuf.
[^0-9] correspond � tout caract�re ne repr�sentant pas un chiffre.
[^abc] 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 (demande-
remplacement-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!