Le langage des expressions régulières



Il s'agit maintenant d'étudier le langage des expressions régulières, fondé sur le rôle d'opérateur des métacaractères.
Rappelons qu'il faut les "échapper" avec \ pour neutraliser leur action d'opérateurs
En voici un résumé global, avant une étude plus systématique.

Signification des métacaractères

 . (point) représente un caractère qcq, sauf \n (comportement par défaut, modifiable)
 * marque la possible répétition du caractère précédent (ou de l'expression précédente entre parenthèses
 + l'expression régulière est présente au MOINS une fois
 ? l'expression régulière est présente au PLUS une fois
 [...] recherche L'UN des caractères de l'ensemble des caractères entre crochets.
  [^..] recherche dans le complémentaire de l'ensemble des caractères qui suivent entre les crochets
 ^ la recherche s'effectue en début de ligne
 $ la recherche s'effectue en fin de ligne
 \ annule le rôle de méta-caractère du caractère qui suit, et lui permet d'avoir sa signification usuelle
  | joue le rôle de "ou" entre 2 exp.rég.
 (...) rôle de groupemrnt et de mémorisation de la regex comprise
 {n,m} le nombre de répétitions attendu va de n à m (et porte sur le caractère ou l'expression précédent), m et n inférieurs à 65536
 {n} le nombre de répétitions attendu doit être exactement n
 {n,} le nombre de répétitions attendu est au moins n
 {,m} le nombre de répétitions attendu est au plus m
  {0,}  {1,}  {0,1} équivalent respectivement à *  +  ?

Classes de caractères et caractères spéciaux

 . (point) représente un caractère qcq (y compris un métacaractère protégé) sauf \n (comportement par défaut, modifiable)
 [...] recherche L'UN (exclusivement) des caractères de l'ensemble des caractères entre crochets.
  [^..] recherche dans le complémentaire de l'ensemble des caractères qui suivent entre les crochets
 [a-z] l'un des caractères de la liste (noter le tiret et pas ..)
 \ij \xhk caractère de code octal 0ij, ou de code hexa x0hk
 \a \b \f \n \r \t caractères spéciaux : bip, retour arrière, saut de page, saut de ligne, retour-chariot, tabulation

Quantificateurs

Caractères d'ancrages

Parenthèses de regroupement et de capture

  Exercices

  1. /(t[aeiou])\1/ reconnait les chaines par exemple : .............. et non pas : ......
  2. Extraire d'un texte les mots qui commencent par une majuscule
  3. s/(\w+)\s+(\w+)/$2 $1/g : motif à expliquer et évetuellement à tester

   TP

############ Changer un format d'affichage de date #############

changedate.pl, compléter la séquence suivante pour transformer le format d'affichage d'une date
 #!/usr/bin/perl -w
 $date ="2002-12-16";
 $date =~ s/.. /.. /;
 print "$date\n"; # doit afficher 16/12/2002
Maintenant étudier le format de date retournée par la commande système date
par exemple sam déc 14 21:54:25 UTC 2002 En extraire les différents éléments pour afficher :
Nous sommes le sam 14 déc 2002, et voici l'heure 21 h 54 mn 25 s

############ Reconnaitre un code postal #############

codepostal.pl : il s'agit de construire une expression régulière capable de reconnaitre et de capturer une sous-chaine représentant un code postal, puis de dire s'il s'agit d'un code postal d'une possible commune de l'académie de Créteil (On a juste besoin de savoir que les départements concernés sont 77, 93 et 94 ;-)
Les réponses attendues sont du genre :

############ Reconnaitre un nombre décimal #############

nombre.pl : il s'agit de trouver les chaines représentant des nombres décimaux quelconques correctement écrits, par exemple -3   12.3   -12.34   +3   34,56.
On demande d'afficher séparément le signe, les parties entière et décimale.
(on sera peut-etre amené à se protéger de capture dues à des regroupements)

Compléments

Les modificateurs

Une expression régulière peut être suivie d'options cumulables, qui modifient l'interprétation de l'expression.
g la recherche est globale, de toutes les occurences
irecherche insensible à la casse
s traiter la chaîne comme une ligne simple (le caractère . reconnait aussi les sauts de ligne)
mtraiter la chaîne comme des lignes multiples (^ et $ s'appliqueront à chaque ligne)
o ne compiler l'expression qu'une seule fois
x utiliser les expressions régulières étendues
  

############### Test des modificateurs ###############

#!/usr/bin/perl -w
###############################
## modificateurs.pl
## étude des modificateurs
## sur une chaine multiligne
###############################
$texte="Si l'info est notre métier,\nnous devons tous nous tenir formés et informés.
Mais méfions-nous des formateurs en \"info\" qui désinforment !
Aimez-vous la science Informatique ou l'info scientifique ?
Voici ma dernière question informelle sur l'informatique :
Etes-vous formateur(e), formaté(e) ou les 2 à la fois ?
";
print "$texte\n\n";
print "regex = ";
$ch = <>; chomp($ch);
print "Résultats obtenus :\n";
print "($1) --> trouvé avec \/$ch\/\n" if $texte =~ /($ch)/ ;
print "($1) --> trouvé avec \/$ch\/i\n" if $texte =~ /($ch)/i ;
print "($1) --> trouvé avec \/$ch\/g\n" if $texte =~ /($ch)/g ;
print "($1) --> trouvé avec \/$ch\/m\n" if $texte =~ /($ch)/m ;
print "($1) --> trouvé avec \/$ch\/s\n" if $texte =~ /($ch)/s ;
------------------------------------
Tester avec des exemples variés dont les suivants. Commentez les résultats
  1. info
  2. forme
  3. form
  4. Tous