Les « expressions régulières » sont un outil pour l'extraction
et le traitement d'informations contenues dans un fichier texte.
Elles sont implémentées dans des commandes Unix comme sed, awk,
dans l'éditeur vi, et, bien sûr, sont utilisées de manière intensive
par le langage Perl (à noter que d'autres langages manipulent les
expressions régulières : à titre d'exemple, le C dispose d'une
librairie de fonctions dédiées).
Une expression régulière définit un « masque » (ou motif),
auquel sera comparé un ensemble de chaînes de caractères :
le masque établit les critères d'appartenance d'une chaîne à un
ensemble. Ainsi, par exemple, on codera l'ensemble {caractères alphabétiques
en minuscules} avec l'expression régulière : [a-z] (ce qui
est équivalent à écrire : [abcdefghijklmnopqrstuvwxyz])
Méta-caractères
Les caractères réservés (méta-caractères) [ et ] désignent
le début et la fin de l'intervalle considéré. Il existe d'autres
méta-caractères, et parmi eux :
. |
désigne n'importe quel
caractère sauf le caractère de fin de ligne |
+ |
désigne le caractère
qui précède répété au moins une fois (ainsi a+
fait correspondre les séquences « a », « aa »,
« aaa », etc.) |
? |
désigne le caractère
qui précède répété au plus une fois (ainsi, a? fait correspondre
les séquences « » (chaîne vide) et « a ») |
* |
désigne le caractère
qui précède répété un nombre quelconque de fois, y compris
zéro (ainsi, a* fait correspondre les séquences « »,
« a », « aa », « aaa », etc.) |
^ |
désigne le ou les caractères
qui précèdent s'ils sont situés en début de ligne
(ainsi, ^L désignera le L de « La vie
», mais pas
le L de « ceci est un L ») |
$ |
désigne le ou les caractères
qui précèdent s'ils sont situés en fin de ligne
(ainsi, L$ désignera le L de « ceci est un L », mais
pas le L de « La vie
») |
() |
désigne un groupe
de caractères (ainsi, a(bcd)+ fait correspondre les séquences
« abcd », « abcdbcd », etc.) et permet également
de mémoriser une séquence (ainsi, <(.+)> mémorise
le texte contenu entre < et > dans la variable $1) |
| |
opérateur OR
(ainsi, a|b désigne le caractère a ou le caractère b) |
[^] |
opérateur « complémentaire »
(ainsi, [^abc] désigne l'ensemble {caractères qui ne sont
pas a, b et c}) |
{n} |
désigne le caractère
qui précède exactement n fois (ainsi, a{2} fait correspondre
la séquence « aa » et non « a » ou « aaa ») |
Cette liste n'est pas exhaustive, mais définit les méta-caractères
les plus courants. On voit immédiatement qu'en combinant plusieurs
de ces méta-caractères, de très nombreuses possibilités de manipulation
d'une chaîne deviennent possibles. Quelques exemples sont donnés
en fin d'article.
A noter que tous les métacaractères peuvent être considérés comme
des caractères traditionnels au sein d'une expression régulière :
il suffit de les faire précéder d'un \. Ainsi, \+ désigne le caractère
traditionnel « + ». Le caractère « \ » lui-même
s'écrira en particulier \\.
Caractères spéciaux
Catégorie particulière de méta-caractères, les caractères spéciaux
permettent de faire référence à des éléments « invisibles »
d'une chaîne de caractères, comme une tabulation, un retour à la
ligne, ou la fin d'une ligne, ou à des types de caractères spécifiques
(lettres, chiffres, etc.). Ces caractères spéciaux sont codés par
un \ suivi d'une lettre. Voici les principaux :
\n |
caractère de fin de
ligne |
\r |
retour à la ligne (retour
chariot) |
\t |
tabulation |
\s |
espacement («
», « . », « , ») |
\S |
tout ce qui n'est pas
un espacement |
\d |
n'importe quel chiffre |
\D |
tout ce qui n'est pas
un chiffre |
\w |
n'importe quelle lettre |
\W |
tout ce qui n'est pas
une lettre |
Utilisation
Une expression régulière s'applique à une variable. Par défaut,
il s'agit de la variable $_. Pour le traitement de toute
autre variable, on utilise l'opérateur =~, ainsi :
$variable =~ /[a-z] ;
compare le contenu de $variable au motif [a-z], à savoir les caractères
alphabétiques en minuscules. Comme il s'agit d'une comparaison,
la valeur renvoyée sera VRAI si $variable comprend au moins un caractère
alphabétique en minuscule, FAUX dans le cas contraire. C'est la
fonction de recherche.
Opérations de substitution Couramment
utilisées en Perl, les opérations de substitution de tout ou partie
d'une chaîne de caractères tirent profit des possibilités des expressions
régulières. Ainsi,
$chaine =~ s/a/b/;
signifie: remplacer, dans $chaine, le premier caractère « a »
par le caractère « b ». Une expression régulière est ici
mise en jeu : désignons-la par expreg. Alors,
s/expreg/chaine/options
est une instruction Perl définissant la substitution (préfixe s)
de expreg (qui peut être le motif d'un ou plusieurs
caractères) par chaine. Parmi les options possibles (suffixe),
figurent :
g |
applique la substitution
non plus une fois mais autant de fois que possible (ainsi, s/a/b/
appliquée à « abaca » donnera « bbaca »,
mais « s/a/b/g » appliquée à « aba » donnera
« bbbcb ») |
e |
précise que l'expression
de remplacement (chaine) est à évaluer (ceci permet d'utiliser
comme expression de remplacement un appel de fonction renvoyant
une chaine) |
i |
permet de ne pas tenir
compte des majuscules |
Opérations de translation
Terminons cette présentation avec l'opération de translation, bien
que cette dernière n'utilise pas les expressions régulières,
mais présente une syntaxe proche de la fonction de recherche et
de l'opération de substitution :
$chaine =~ tr/liste1/liste2/options;
transpose chaque caractère de liste1 en le caractère
correspondant de liste2. Trois options sont possibles :
c |
complète liste1
par les caractères en trop de liste2 |
d |
supprime les caractères
de liste1 qui n'ont pas d'équivalent dans liste2 |
s |
« compresse »
les caractères en double |
Exemples
$chaine =~ s/\n//g;
remplace tous les caractères de fin de ligne par une chaine vide.
$chaine =~ s/([a-zA-Z]){2}/$1/g;
élimine tous les « doublons » (« aa », « bb »
)
d'une chaine, en les « compressant » (« aa »
donne « a », « bb » donne « b »
).
$chaine =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(c,
hex($1))/eg;
convertit les valeurs hexadécimales du type %xx, où xx est un code
ASCII en hexadecimal, en le caractère qu'elle désigne (la fonction
Perl pack() renvoyant le caractère correspondant à la valeur passée
en argument). Cette dernière instruction peut par ailleurs se simplifier :
$chaine =~ s/%([a-f0-9]{2})/pack(c, hex($1))/egi;
|