Fiche N°3 - Les expressions régulières
1.	Recherche de motif
Un motif (pattern) s'écrit entre slashes : /motif /
Opérateurs de recherche de motif : 		=~	et	!~
P.ex. la condition ($rep =~ /oui/) est vraie et la condition ($rep !~ /oui/) est fausse, si la chaîne $rep contient la chaîne "oui".
1.1.	Classes de caractères
Expression	Valeur	Exemple	
.	Tout caractère sauf \n	($an =~ /199./) est vraie si $an contient 1990, mais aussi 199t	
\n \r \t \f	Fin de ligne, retour chariot, tabulation, saut de page		
\s	Espace ou tout caractère de position (\n \r \t \f)		
\S	Tout caractère sauf \s		
\d	Tout chiffre		
\D	Tout caractère qui n'est pas un chiffre		
\w	Toute lettre, ou chiffre ou _		
[intervalle]	Tout caractère dans l'intervalle 
	[a-z0-9] pour une lettre ou un chiffre. Attention : n'intègre pas les car. accentués	
[liste]	Tout caractère de la liste	[àâäéèêëîïöôùûüçÀÂÄÉÈÊËÎÏÔÖÙÛÜÇ] désigne un  caractère diacritisé du français	
[^liste]	Tout caractère hors de la liste	[^\w] un caractère qui n'est ni une lettre ni un chiffre ni _	
\\ \. \+ \* \| \( \) \/ \[ \] \^ \$ \{ \} \- 	Méta-caractères d'expression régulière (le backslash est un car. d'échappement)		
\xHH 	Caractère donné par son code hexadécimal. 	\x20 pour espace	
1.2.	Disjonction (ou logique)
Les motifs combinés par l'opérateur | (pipe), sont liés par un ou logique. Les parenthèses peuvent être nécessaires pour isoler des sous-motifs (attention aux règles de priorité : le ou à une priorité très basse).Par ex. :
$jour=~/(lun|mar|mer|jeu|same)di|dimanche|(mon|tues|wednes|thurs|fri|satur|sun)day/ est vrai si $jour contient un jour de la semaine en français ou en anglais
1.3.	Opérateurs de répétition
- opérateur + : désigne l'occurrence de 1 ou plusieurs fois ce qui précède immédiatement
	($an =~ /1[0-9]+/) est vraie si $an contient un nombre de plus d'un chiffre commençant par 1… 
	(p. ex. "182323").
- opérateur * (étoile de Kleene) : désigne l'occurrence de 0 ou plusieurs fois ce qui précède immédiatement
	($an =~ /1[0-9][0-9][0-9]/) est vraie si $an contient un nombre de 4 chiffres commençant par 1 (p. ex. "1").
- opérateur ? : désigne l'occurrence de 0 ou 1 fois ce qui précède immédiatement
	($an =~ /(20)?[0-9][0-9]/) est vraie si $an contient un nombre de deux chiffres ou un nombre de 4 chiffres commençant par 20.
- le nombre de répétition peut être déterminé entre {} : {n} n fois, {n,} au moins n fois, {n,m} entre n et m fois.
Par ex. (\w+\W*){5} désigne une suite de 5 mots
1.4.	Assertions de longueur nulle (anchors)
1.4.1.	Marqueurs de position
^ et $ désignent le début et la fin de la chaîne.
	($rep =~ /^oui$/) est vraie si la chaîne $rep est égale à "oui" fausse si $rep est égale à "oui!" ou "…oui"

\b désigne la limite (à gauche ou à droite) d'un mot (séquence de car. \w)
1.4.2.	Marqueurs de contexte
(?=motif) teste la présence d'un motif en avant (mais le motif ne fait pas partie de la chaîne reconnue). Par exemple, /\w+(?=\s)/ teste la présence d'un mot suivi par un blanc (sans inclure le blanc dans la reconnaissance)

(?!motif) teste l'absence d'un motif en avant.

(?<=motif) ou (?<!motif) teste la présence ou l'absence d'un motif en arrière.
Par exemple, pour supprimer un retour chariot qui ne serait pas précédé par un point ou suivi par une majuscule
$texte=~s/(?<!\.)\n(?![A-Z])/ /;
1.5.	Options
Les options de recherche sont indiquées après le deuxième slash :
•	Option i : insensible à la casse $date=~/$week/i;
•	Option g : recherche globale. Dans un contexte scalaire, chaque exécution de //g trouve la prochaine correspondance et retourne vrai si il y a correspondance et faux si il n'y en a plus.
1.6.	Recherche de plusieurs occurrences dans une chaîne
L'affectation à une liste permet d'y stocker toutes les valeurs trouvées : sous-motifs ou bien liste des correspondances trouvées avec l'option g.
P. ex. : @mots=($phrase=~/\w+/g); permet de récupérer la liste des mots de la phrase.
2.	Reconnaissance de sous-motifs
Les sous-motifs isolés par des parenthèses sont stockés dans les variables $1, $2, $3…
Dans le cas d'une imbrication de parenthèses, l'ordre des sous-motifs correspond à l'ordre des parenthèses ouvrantes.
Par ex si $date ="Tuesday 11th October" alors avec
($date=~/((Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day)\s([0-9][0-9](st|nd|rd|th))\s(\w+)/) on aura
$1=Tuesday,$2="Tues",$3="11th", $4="th", $5="October"
2.1.	Interpolation et référence à un sous-motif
Dans un motif, toute référence à une variable scalaire sera interpolée. Cela peut permettre une meilleure lecture d'une expression complexe.
$week="Mon|Tues|Wednes|Thurs|Fri|Satur|Sun"; $date=~/($week)day/;
Il est également possible de se référer aux sous-chaînes qui viennent d'être reconnues, en utilisant les expressions \1 \2 \3 etc…
$ligne=~/(\w+)\s\1/; permet de rechercher une répétition de mot. $ligne=~/("|').+\1/; permet de reconnaître une chaîne entre " " ou '  ' 
3.	Recherche gourmande ou non (greediness) 
Par défaut, les opérateurs de répétition sont "gourmands" : de gauche à droite, ils cherchent à "avaler" la plus grande quantité de caractère possible. Pour brider cette gourmandise, il faut accoler un point d'interrogation ? derrière l'opérateur de répétition : *?; +?, ??
Par ex. si $ligne ="Napoleon\tBonaparte\tEmpereur\t15-08-1769\t5-5-1821" alors avec
$ligne=~/(.+)\t(.+)\t(.+)/ ; $prenom=$1; $nom=2; $fonction=$3 ; on aura
$nom="Napoleon\tBonaparte\tEmpereur", $prenom="15-08-1769", $fonction="5-5-1821" à cause de l'avidité de la première expression. Pour avoir un résultat correct, on préfèrera : $ligne=~/(.+?)\t(.+?)\t(.+?)/;
NB : en règle générale, sur de grandes chaînes, il faut éviter d'utiliser les expressions trop génériques du type   .*   qui ralentissent l'exécution (trop de possibilités à prendre en compte).
4.	Recherche/remplacement : s///
Syntaxe : $chaineDeRecherche=~s/motifDeRecherche/chaîneDeRemplacement/;
Si on veut "remplacer tout", il faut utiliser l'option g.
La chaîne de remplacement peut référer aux sous-motifs reconnu. P. ex. :
$phrase=~s/(\w+)/<tok>$1<\/tok>/g; permet d'encadrer tous les mots de balises <tok>
Evalué en contexte scalaire, le s///g renvoie le nombre de remplacements effectués : 
$nbMots=($phrase=~s/(\w+)/$1/g);
5.	Comment tenir compte des particularités linguistiques ?
Certaines recherches peuvent être affectées par la "localisation" géographique du code. Par exemple, pour le français, on aura envie de considérer Ê comme inclut dans l'intervalle [A-Z], ou être considéré comme un caractère de mot (classe \w). La directive use locale permet d'utiliser la configuration spécifique de la localisation (majuscules, minuscules, formatage des dates et des réels, etc.) si le système le permet.
6.	Exercices
*** Compter les occurrences d'un motif dans un texte
*** Récupérer dans une liste la 5ème colonne d'un tableau représenté en texte tabulé
*** Trier sur la ième colonne d'un tableau représenté en texte tabulé
*** Supprimer toutes les balises d'un doc. HTML.
On ne conservera que le texte qui est compris entre <body> et </body>, les <p> seront remplacés par des CR, les <br/> par des LF, les entités par les car. correspondants. Le texte pris entre des commentaires ou des balises scripts sera éliminé.
*** Tokenisation simple avec typologie
Mots \w
Blancs \s
Ponctuations simples , . et doubles ; : ! ?
Symboles ( ) < > % [ ] { } # & $ £ + - etc.
Guillemets " “ ” ″ « »(unicode 0x0022, 0x201C, 0x201D, 0x2033, 0x 00AB, 0x00BB
Apostrophe ′ ‘ ’ ‛ (unicode 0x2018, 0x2019, 0x201B, 0x2032) intégrée au mot qui précède
7.	Références :
Pour les gens pressés : http://perl.enstimac.fr/DocFr/perlrequick.html 
Référence complète : file:///C:/Perl/html/lib/Pod/perlreref.html
 http://perl.enstimac.fr/DocFr/perlre.html