CHAP 4 Expressions régulières Flashcards
DEF Expressions régulières
- Un motif sous forme de chaîne de caractères
- Qui représente un ensemble (potentiellement infini) de chaînes
de caractères
OBJECTIF Expressions régulières
- Identifier du texte ou des parties de texte
- Chercher dans du texte
- Transformer du texte
Autres motifs permis
* Point d’exclamation [!…] — caractère qui n’est pas dans la
liste
* Intervalles [<debut>-<fin>] — caractère entre <debut> et <fin></fin></debut></fin></debut>
Exemple
* « ls [!co] » — ne terminent ni par c ni par o
* « ls [f-i] » — commencent par f, g, h ou i
Entre crochets, les caractères deviennent littéraux
* « cat [][!?] » — commence par ], [, !, ? ou *
Glob ≠ expression régulière
Différences
- glob → noms de fichier
- expressions régulières → texte
- Les conventions sont différentes
Qui utilise les expressions régulières ?
Outils de manipulation de texte
- Éditeurs de texte: vi, et tous les éditeurs modernes, …
- Outils autonomes: grep, sed, …
- Base de données: MySQL, MariaDB, Oracle, …
Langages de programmation
* De base en Perl, Python, Java, JavaScript, etc.
→ Opérations sur le texte
→ Vérification et sanitarisation de données
Autres utilisations
* Colorateur syntaxique colorie les mots clés
* Serveur web filtre et transforme des requêtes HTTP
* Compilateur reconnaît les éléments textuels d’un programme
Différentes conventions ⋆
De nombreux outils et usages
Font que la syntaxe et les mécanismes varient
- POSIX Basic regular expression (BRE)
- POSIX Extended regular expression (ERE)
- Extensions GNU à POSIX
- Perl compatible regular expression (PCRE)
- Spécificités de chaque langage et outil
Exemple de différences
* Échappement des caractères spéciaux
* Classes de caractères
* Mécanismes plus avancés (lookahead, références relatives, etc.)
Dans le cours: BRE et ERE (POSIX)
Plusieurs commandes les utilisent, notamment grep et sed
La commande grep: rappel
grep — cherche les lignes correspondant à un motif
BRE =
basic regular expressions
* Une des versions syntaxiques POSIX (l’autre étant ERE)
* Reconnue par la plupart des commandes Unix
* Reconnue par plusieurs éditeurs de texte (Vi/Vim, Emacs)
* Syntaxe de base plus ou moins universelle
JOKER
Le point « . » correspond à n’importe quel caractère sauf NUL
Note
* Équivalent au « ? » en glob
* Utiliser « . » pour reconnaître un point
* Certains outils ou options n’incluent pas la fin de ligne dans « . »
L’étoile: répétition ⋆
L’étoile * indique une répétition d’un motif
* 0 fois
* 1 fois
* ou plusieurs fois
$ cat fruits.txt
banane
mangue
pomme
$ grep -o ‘m*e’ fruits.txt
e
e
mme
Note
* Protéger l’étoile du shell
Ancrage ⋆
Deux caractères spéciaux permettent de forcer une position
* Le circonflexe « ^ » indique le début de la chaîne (ou ligne)
* Le dollar « $ » indique la fin de la chaîne (ou ligne)
$ grep ‘^fricas ‘ /usr/share/dict/french
fricassée
fricassées
fricasser
$ grep ‘key$ ‘ /usr/share/dict/french
hockey
jockey
$ grep ‘^mettre$ ‘ /usr/share/dict/french
mettre
- -x équivaut à ajouter des ^ et $ implicites
- Protéger $ du shell
Crochets : liste de caractères ⋆
« [] » listent un choix parmi plusieurs caractères
$ echo “mes aieux” | grep -o ‘[aeiou]*’
e
aieu
Note
* Protéger « [ » et « ] » du shell
Crochets : négation de classe ⋆
* Entre les crochets,
* On peut interdire un ou plusieurs caractères
* En commençant par le circonflexe « ^ »
$ echo “mes aieux” | grep -o ‘[^aeiou]*’
m
s
x
Note
* Le circonflexe ^ joue deux rôles (ancrage et négation)
Crochets : intervalles ⋆
* Entre les crochets, on peut préciser un intervalle
* Avec le caractère « - »
$ grep ‘[x-z][a-c][y-z]’ /usr/share/dict/french
zézayer
$ grep -o ‘[x-z][a-c][y-z]’ /usr/share/dict/french
zay
$ echo ‘!@#$%^&-=+()[]’ | grep –color ‘[!-*]’
Les intervalles peuvent dépendre
* De la locale (détails plus tard)
* ou du codage (ASCII, Unicode, etc.) man ascii
Classes de caractères POSIX
Certains ensembles de caractères sont plus fréquents
- [:lower:] : minuscules
- [:upper:] : majuscules
- [:digit:] : chiffres
- [:alpha:] : minuscules et majuscules
- [:alnum:] : minuscules, majuscules et chiffres
- [:punct:] : ! . ; + # / \ | etc.
- [:blank:] : espace et tab
- [:space:] : espace, tab, \r, \n, etc.
- [:cntrl:] : caractères de contrôle (NUL, BS, ESC, DEL, etc.)
- [:graph:] : caractères graphiques, [:alnum:] et [:punct:]
- [:print:] : caractères affichables, [:graph:] et espace
- [:xdigit:] : caractères hexadécimaux
Les classes dépendent de la locale (détails plus tard)
Autres classes de caractères
GNU, Perl et de nombreux outils reconnaissent d’autres classes
- \w : lettre, chiffre ou souligné « _ »
- \W : l’inverse de \w
- \s : un espace
- \S : l’inverse de \s
- \d : un chiffre (pas GNU)
- \D : l’inverse de \d (pas GNU)
- \b : frontière entre mot et non-mot
- \B : l’inverse de \b
- < : début de mot
- > : fin de mot
En fonction des outils, les classes dépendent (ou non) de la locale
Classes d’équivalence POSIX
* [=c=] : classe d’équivalence du caractère c
* Par exemple [=e=] inclut eéèêë
$ grep ‘[[=e=]][[=e=]][[=e=]]’ /usr/share/dict/french
agréée
agréées
créée
[…]
suppléées
Attention aux doubles crochets
$ echo ‘e + é = è’ | grep -o ‘[=e=]’
e
=
Les classes d’équivalence dépendent aussi de la locale
Collations POSIX
- digraphe = 2 caractères qui en forment un seul
- Certaines langues ont des digraphes
- Exemple, en tchèque, ch est une lettre entre h et i
- En croate, lj est une lettre entre l et m
- Avant, en allemand, ss était une lettre à part (maintenant 𝛽)
- La norme POSIX permet de gérer ces doubles caractères
- Dans le cours, on ne s’en préoccupera pas (pas de problème en
français/anglais)