Les expressions régulières (appelées aussi expreg, regexp, patern, motif) s’utilisent comme un filtre. Elles permettent de définir un modèle de chaînes de caractère décrivant un ensemble possible de mots ou de groupes de mots plus ou moins complexe.
Très utile pour filtrer une recherche de fichier parmi une longue liste ou les résultats des logs ou encore pour créer des règles précises dans Fail2Ban (pour ne citer que ces cas).
Utilisation (quasi) universelle des symboles
Les définitions ci-dessous sont quasiment valables pour tous les programmes et tous les langages utilisant les expressions régulières.
| # Ou logique, l'expression située avant ou après doit apparaître : Noir|Blanc |
Support pour les expressions régulières
Fichier words
Dans tous les Linus (ou presque) il existe un fichier words
situé dans /usr/share/dict/words
, c’est un lien symbolique vers /etc/dictionaries-common/words
, lui même étant un lien symbolique vers /usr/share/dict/french
qui n’est rien d’autre qu’un dictionnaire français.
# ls -l /usr/share/dict/ |
Fichiers exemples
Voici plusieurs fichiers comportant des listes afin de tester les expressions régulières :
- Listing des éléments chimiques : list-CHIMIE.txt
- Listing des étoiles : list-ETOILE.txt
- Listing des constellations : list-CONSTE.txt
- Listing des dinosaures : list-DINOSA.txt
- Listing assez complet des animaux : list-ANIMAU.txt
- Listing des arbres : list-ARBRES.txt
- Listing des couleurs : list-COULEU.txt (Vraiment très complets, exemple : Couleur “cuisse de nymphe” ou “ventre de biche” [si si…] )
- Listing des erreurs : ERROR-list.txt (Mots comportant des erreurs comme 3 ou 4 fois la même lettre, utile pour les tests)
Comment utiliser les expressions régulières ?
Nous pouvons utiliser grep
par exemple, mais il existe aussi sed
. Les expressions régulières peuvent être également utilisées avec des langages comme php ou comme filtre dans Fail2Ban.
Commande grep
Extrait du manuel de la commande grep
# grep recherche dans les FICHIERs indiqués [...] les lignes correspondant à un certain MOTIF. |
Manuel en ligne : http://www.linuxcertif.com/man/1/grep/
Les options de grep et egrep
Pour effectuer une recherche à l’aide d’une expression régulière appelée motif :
grep [Options] motif [File1...] |
La commande egrep
et identique à grep
mais elle permet d’utiliser des expressions régulières plus complexes avec l’utilisation des symboles + , ? , | , ( , et ).
Pour utiliser grep
avec l’utilisation des symboles + , ? , | , ( , ) on précisera l’option -E
Options supplémentaires
Options assez courantes d’utilisation pour faire des recherches :
grep -v # Sélectionner les lignes sans résultat |
Chercher des caractères dans un fichier
Nous allons tester ici plusieurs motifs relativement simples en utilisant les caractères [ ], ^ et #. Il s’agit ici de chercher des caractères ou une suite de caractères dans un fichier.
[...] # Un caractère à cette position parmi ceux indiqués |
Chercher des caractères à n’importe quelle position
Pour chercher un ou plusieurs caractères à n’importe quelle position on utilise [ ].
[...] # Un caractère à cette position parmi ceux indiqués |
Par exemple [abcdefgh] cherchera le caractère a, b, c, d, e, f, g ou h n’importe où dans la ligne. Il peut aussi s’écrire de la façon suivante : [a-h] qui fera exactement la même chose
Quelques exemples
Chercher les mots contenant la lettre y. Il n’est pas nécessaire d’utiliser les crochets pour 1 seul caractère.
# grep y list-ETOILE.txt |
Chercher les mots contenant la lettre B ou C majuscules :
# grep [BC] list-ETOILE.txt |
Chercher les mots contenant la lettre x ou z minuscule :
# grep [xz] list-ETOILE.txt |
Chercher les mots contenant la lettre x minuscule ou z minuscule ou V majuscule :
Acrux 1 |
Chercher les mots contenant les lettres v, w, x, y ou z ( de v à z ) :
Acrux 1 |
Chercher les mots contenant les lettres H, W, v, w, x, y ou z. La notation [HWv-z] est équivalente à [HWvwxyz]
# grep [HWv-z] list-ETOILE.txt |
Chercher les mots contenant les lettres D, E, F, G, v, w, x, y ou z.La notation [D-Gw-z] est équivalente à [DEFGwxyz].
# grep [D-Gw-z] list-ETOILE.txt |
Chercher des caractères au début
Pour chercher un ou plusieurs caractères au début on utilise ^.
^ # En début de chaîne |
Quelques exemples
Chercher les mots commençant par K majuscule, quand il s’agit d’un seul caractère les crochets ne sont pas nécessaires :
# grep ^K list-ETOILE.txt |
Chercher les mots commençant par B ou C majuscule :
# grep ^[BC] list-ETOILE.txt |
Chercher les mots commençant par b ou c minuscule :
# grep ^[bc] list-ETOILE.txt |
Chercher les mots commençant par un b minuscule ou un C majuscule ou un V majuscule
# grep ^[bCV] list-ETOILE.txt |
Chercher les mots commençant par un S, V, W, X, Y ou Z ( de S à Z)
# grep ^[S-Z] list-ETOILE.txt |
Chercher les mots commençant par un I, J, K, L, V, W, X, Y ou Z. La notation [I-LV-Z] est équivalente à [IJKLVWXYZ].
# grep ^[I-LV-Z] list-ETOILE.txt |
Chercher des caractères à la fin
Pour chercher un ou plusieurs caractères à la fin on utilise #.
# # En fin de chaîne |
La recherche s’effectue sur la fin de la LIGNE. Donc si une liste comporte des espaces ou des tabulations à la fin de chaque ligne la recherche risque de ne pas renvoyer de résultat.
Quelques exemples
Chercher les mots finissant par la lettre a
# grep a# list-ETOILE.txt |
Chercher les mots finissant par B ou s
# grep [Bs]# list-ETOILE.txt |
Chercher les mots finissant par la lettre b à f. Il s’agit toujours d’un ou exclusif.
# grep [b-f]# list-ETOILE.txt |
Chercher les mots finissant par un B, C, D**, E, g, h, i, j ou k. La notation [B-Eg-k] est équivalente à [BCDEghijk].
# grep [B-Eg-k]# list-ETOILE.txt |
Chercher des caractères compris entre 2 autres
Le groupement des symboles ^[…] permettra d’effectuer une recherche au début parmi les caractères situés entre les crochets. A l’inverse […]# permettra d’effectuer une recherche à la fin
[...] # Un caractère à cette position parmi ceux indiqués |
Le principe est le même que vu précédemment sauf que l’on englobe la partie ‘variable’ avec des caractères définis.
Quelques exemples
Chercher des mots commençant par C, suivis d’un caractère entre e et i, lui même suivis de la lettre r. La recherche renverra entre autre Cératosaurus, Cerisier, Chrome
# grep ^C[e-i]r list-DINOSA.txt list-ARBRES.txt list-CHIMIE.txt |
Chercher des mots se terminant par n, précédé d’un caractère entre a et u, lui même précédé de la lettre m. La recherche renverra entre autre Doberman, Caiman, Saumon, Commun, Carmin.
# grep m[a-u]n# list-* |
Chercher des groupes de mots
Pour utiliser les parenthèses, il faut utiliser egrep ou grep avec l’option -E et mettre le motif entre guillemets. Les parenthèses étant considérées comme des expressions régulières étendues.
| # Ou logique, l'expression située avant ou après doit apparaître : Noir|Blanc |
Groupe de mot à n’importe quelle position
L’effet est le même qu’avec les crochets sauf qu’il ne s’agit plus de caractères unique comme a, k, t, ou v mais de groupe de caractères comme able, logue, ium, …
(...) # Groupement de caractères. Exemple (vo|par)lant à la place de volant|parlant |
Le symbole pipe |
permet de séparer les groupes de mots et agit comme un ou logique.
Quelques exemples
Chercher les mots contenants la suite de caractères app avec grep
# grep -E app list-* |
# egrep app list-* |
Chercher les mots contenants les suites de caractères app ou rolo ou lem
# grep -E '(app|rolo|lem)' list-* |
Chercher les mots contenants les suites de caractères ephal ou océphal ou ycéphal
# grep -E '(e|océ|ycé)phal' list-* |
Groupe de mot au début
Le groupement des symboles ^(…|…|…) permettra d’effectuer une recherche au début parmi les groupes de caractères situés entre les parenthèses.
^(...) # Rechercher au début le(s) groupe(s) de caractères contenus entre parenthèses |
Le symbole pipe | permet de séparer ses groupes et agit comme un ou logique.
Quelques exemples
Chercher les mots commençant par les caractères Néo ou Opo ou Cui au début
# grep -E '^(Néo|Opo|Cui)' list-* |
Chercher les mots commençant par Be, lui même suivis de ll ou lon ou rna. Le résultat renvois par exemple Bellatrix, Bernacle, Belons.
# grep -E '^Be(ll|lon|rna)' list-* |
La notation ^Be(ll|lon|rna) est équivalente à ^(Bell|Belon|Berna).
Groupe de mot à la fin
Le groupement des symboles (…|…|…)# permettra d’effectuer une recherche à la fin parmi les groupes de caractères situés entre les parenthèses.
(...)# # Rechercher à la fin le(s) groupe(s) de caractères contenus entre parenthèses |
Le symbole pipe | permet de séparer ses groupes et agit comme un ou logique.
Quelques exemples
Chercher les mots finissant par unium ou gent ou gène
# grep -E '(unium|gent|gène)#' list-* |
Chercher les mots finissant par les groupes de caractères ephale ou gule ou lule
# grep -E '(epha|gu|lu)le#' list-* |
La notation (epha|gu|lu)le# est équivalente à (ephale|gule|lule)#
Groupe de mot entre 2 caractères
Le groupement des symboles ^x(…|…|…)y permettra d’effectuer une recherche sur un caractère au début de chaque ligne (ici x). Ce caractère sera suivis d’un groupe de caractères parmi ceux entre parenthèses (exemple1|exemple2|exemple3) et le tout sera suivis par un autre caractère (ici y).
^x(...)y # Recherche au début un caractère suivis d'un groupe suivi d'un caractère |
A l’inverse le groupement des symboles x(…|…|…)y# permettra d’effectuer une recherche sur un caractère en fin de ligne (ici x). Ce caractère sera précédé d’un groupe de caractères parmi ceux entre parenthèses (exemple4|exemple5|exemple6) et le tout sera précédé par un autre caractère (ici y).
Quelques exemples
Chercher des mots commençant par M, suivis des caractères an, en ou on, eux même suivis de la lettre d. La recherche renverra par exemple Mandarin, Mendélévium ou Mandarine.
# grep -E '^M(an|en|on)d' list-* |
Chercher des mots commençant par B, suivis des caractères la ou ra suivis des lettres nc. La recherche renverra par exemple Blanc, Blanchets, Branchiopodes
# grep -E '^B(la|ra)nc' list-* |
La notation ^B(la|ra)nc est équivalente à ^(Bla|Bra)nc et à ^B(lanc|ranc) ainsi qu’à ^(Blanc|Branc).
Utilisation de +, *, ., {n}, {n, } et {n,m}
Nous allons tester ici les caractères suivants :
. # Un caractère quelconque |
Utilisation du point “ . “
Le point remplace n’importe quel caractère - et un seul - dans le motif.
. # Un caractère quelconque |
Le point est une sorte de ‘joker’
Quelques exemples
Chercher des mots avec la lettre a, suivit d’un caractère ( et un seul ) suivit lui même par im. L’espace est considéré comme un caractère c’est pour cette raison que le résultat affiche Paulownia impérial.
# grep -E 'a.im' list-* |
Chercher des mots contenant la, suivit d’un caractère ( et un seul ) suivit lui même par in. Lapin n’apparaît pas dans les résultats car il commence par une majuscule.
# grep -E 'la.in' list-* |
Chercher les mots se terminant par un caractère, n’importe lequel, précédé de Canar
# grep -E 'Canar.'# list-* |
Si on se met pas le symbole # indiquant la fin, le résultat se traduit par : Chercher un mot commençant par Canar, suivis d’une lettre au minimum
# grep -E 'Canar.' list-* |
Autre exemple pour mieux comprendre : Chercher un mot commençant par Canard, suivis d’une lettre au minimum
# grep -E 'Canard.' list-* |
Chercher des mots contenant nil, précédé d’un caractère ( et un seul )
# grep -E '.nil' list-* |
Chercher des mots contenant nil, précédé d’un caractère ( et un seul ) au début
# grep -E ^'.nil' list-* |
La notation .nil n’est pas équivalente à [A-Za-Z]nil. Cette dernière notation exige que nil précède obligatoirement un caractère compris entre A-Z ou a-Z alors que le point non (Il peut y avoir un espace par exemple). Voir le chapitre ci dessous pour plus d’explication.
Utilisation du ‘+’
Permet, par exemple de chercher une occurrence d’un caractère.
+ # Le caractère placé avant doit apparaître de 1 à n fois. "z","zz","zzz" |
La notation s+ cherchera les mots comportant 2 ‘s‘
Quelques exemples
On cherche des mots où la lettre s apparaît au moins une fois :
# grep -E 's+um' list-* |
Pour faire la comparaison utilisons la même commande mais avec un point :
# grep -E 's.um' list-* |
Le point prend n’importe quel caractère, le + quand à lui cherche une ou plusieurs fois le caractère situé avant, ici c’est la lettre s
Utilisation de l’étoile *
Utilisation de l’étoile
* # Le caractère situé avant doit apparaître de 0 à n fois. "","s","ss",... |
Voir les exemples ci dessous.
Quelques exemples
On cherche des mots où la lettre s apparaît de zéro à n fois précédé des caractères um. Le résultat renvois Lumps, Megatherium, Megatheriums, Opossum, Opossums, Paumier.
# grep -E 's*um' list-* |
Le résultat ci dessus à été tronqué.
Utilisation du point d’interrogation ?
Utilisation du point d’interrogation.
? # Le caractère situé avant doit apparaître 0 ou 1 fois |
Quelques exemples
On cherche des mots où la lettre s apparaît de zéro à 1 fois précédé des caractères um. Le résultat renvois Lump, Lumps, Megatherium, Megatheriums, Opossum, Opossums, Paumier
# grep -E 's?um' list-* |
Le résultat ci dessus à été tronqué.
Utilisation de {n}
Utilisation de n pour préciser une quantité d’occurrence.
{n} # Le caractère situé avant doit apparaître exactement n fois |
Avec s{2} la lettre s devra apparaître 2 fois.
Quelques exemples
Chercher des mots avec la lettre e qui se répète 5 fois suivi par les lettres re
# grep -E 'e{5}re' EROR-list.txt |
Peut être utile dans la pratique pour repérer les espaces en trop dans les textes ou les codes sources…
Utilisation de {n, }
Utilisation de n pour préciser une quantité minimum d’occurrence.
{n,} # Il apparaît n fois ou plus |
Avec s{2,} la lettre s devra apparaître minimum 2 fois.
Quelques exemples
Chercher des mots avec la lettre e qui se répète de 3 à n fois et se termine par re
# grep -E 'e{3,}re' EROR-list.txt |
Peut être utile dans la pratique pour repérer les espaces en trop dans les textes ou les codes sources…
Utilisation de {n,m}
Utilisation de n et m pour préciser une quantité d’occurrence comprise entre 2 nombres.
{n,m} # Il apparaît entre n et m fois |
Avec s{2,5} la lettre s devra apparaître entre 2 et 5 fois.
####7.7.1 Quelques exemples
Chercher des mots avec la lettre e qui se répète de 2 à 4 fois et se termine par re
# grep -E 'e{2,4}re' EROR-list.txt |
Expressions régulières complexes
J’entends par ‘complexes’ des expressions composées de nombreuses contraintes comme on pourrait le voir dans les filtres de Fail2ban ou dans les scripts php pour vérifier la validité d’une adresse mail.
La suite de l’article comporte des exemples
Chercher les lignes comportant des mots commençant par Y suivis de 1 ou plusieurs caractères eux(lui) même(s) suivis de m. La lettre m n’est pas forcément la lettre finale.
# grep -E 'Y.{1,}m' list-* |
Chercher les lignes comportant des mots commençant par Y suivis de 1 ou plusieurs caractères eux(lui) même(s) suivis de m. La lettre m est la lettre finale.
# grep -E 'Y.{1,}m#' list-* |
Suite : Soon