TUTORIELS 
Les expressions régulières en Perl
Le Dynamic HTML n'est pas un langage en soi, mais la combinaison de code HTML, de feuilles de style et de code Javascript.  (15 mars 2001)
 

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;

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page