Expressions régulières
Table des matières
- Introduction aux regex
- Syntaxe de base
- Quantificateurs
- Classes et groupes
- Regex avec grep
- Regex avec sed et awk
- Exercices pratiques
1 - Introduction aux regex
Qu'est-ce qu'une regex ?
Une expression régulière (regex) est un pattern qui décrit un ensemble de chaînes de caractères.
Types de regex
| Type | Outils | Syntaxe |
|---|---|---|
| BRE | grep, sed | Basique, échappement pour +, ? |
| ERE | grep -E, awk | Étendue, +, ?, | natifs |
| PCRE | grep -P | Perl-compatible, lookahead |
Où utiliser les regex
grep: recherche dans des fichierssed: substitution de texteawk: filtrage et traitement[[ =~ ]]: tests en Bash
🔝 Retour à la table des matières
2 - Syntaxe de base
Caractères littéraux
# Recherche littérale
grep "hello" fichier.txt
Métacaractères
| Caractère | Signification |
|---|---|
. | N'importe quel caractère |
^ | Début de ligne |
$ | Fin de ligne |
* | 0 ou plus du précédent |
\ | Échappement |
Exemples
# N'importe quel caractère
grep "h.llo" fichier.txt # hello, hallo, h3llo...
# Début de ligne
grep "^hello" fichier.txt # Lignes commençant par hello
# Fin de ligne
grep "world$" fichier.txt # Lignes finissant par world
# Les deux
grep "^hello$" fichier.txt # Lignes contenant exactement "hello"
# Échapper un métacaractère
grep "\." fichier.txt # Recherche un point littéral
Ancres
# Ligne vide
grep "^$" fichier.txt
# Ligne avec seulement des espaces
grep "^[[:space:]]*$" fichier.txt
# Mot complet
grep "\bword\b" fichier.txt # ERE/PCRE
grep "\<word\>" fichier.txt # BRE
🔝 Retour à la table des matières
3 - Quantificateurs
Tableau des quantificateurs
| Quantificateur | Signification | Exemple |
|---|---|---|
* | 0 ou plus | ab*c → ac, abc, abbc |
+ | 1 ou plus | ab+c → abc, abbc (pas ac) |
? | 0 ou 1 | ab?c → ac, abc |
{n} | Exactement n | a{3} → aaa |
{n,} | n ou plus | a{2,} → aa, aaa, aaaa... |
{n,m} | Entre n et m | a{2,4} → aa, aaa, aaaa |
Exemples
# Avec grep -E (ERE)
grep -E "ab+c" fichier.txt # abc, abbc, abbbc
grep -E "ab?c" fichier.txt # ac, abc
grep -E "a{3}" fichier.txt # aaa
grep -E "a{2,4}" fichier.txt # aa, aaa, aaaa
# BRE (avec échappement)
grep "ab\+c" fichier.txt
grep "a\{3\}" fichier.txt
Quantificateurs gourmands vs paresseux
# Gourmand (par défaut): match le plus long
echo "aaaaab" | grep -oE "a+"
# aaaaa
# Paresseux (PCRE seulement): match le plus court
echo "aaaaab" | grep -oP "a+?"
# a (répété 5 fois)
🔝 Retour à la table des matières
4 - Classes et groupes
Classes de caractères
# Un caractère parmi plusieurs
[abc] # a, b, ou c
[a-z] # Lettre minuscule
[A-Z] # Lettre majuscule
[0-9] # Chiffre
[a-zA-Z] # Lettre
[a-zA-Z0-9] # Alphanumérique
# Négation
[^abc] # Tout sauf a, b, c
[^0-9] # Tout sauf chiffre
Classes POSIX
| Classe | Équivalent |
|---|---|
[[:alpha:]] | [a-zA-Z] |
[[:digit:]] | [0-9] |
[[:alnum:]] | [a-zA-Z0-9] |
[[:space:]] | Espace, tab, newline |
[[:lower:]] | [a-z] |
[[:upper:]] | [A-Z] |
[[:punct:]] | Ponctuation |
Groupes et alternation
# Groupement
grep -E "(ab)+" fichier.txt # ab, abab, ababab
# Alternation (OU)
grep -E "cat|dog" fichier.txt # cat ou dog
grep -E "(red|blue) car" fichier.txt
# Capture pour backreference
echo "hello hello" | sed 's/\(hello\) \1/DOUBLE/'
# DOUBLE
Backreferences
# Trouver les mots doublés
grep -E "\b(\w+)\s+\1\b" fichier.txt
# Remplacer avec sed
echo "hello hello" | sed 's/\([a-z]*\) \1/\1/'
# hello
🔝 Retour à la table des matières
5 - Regex avec grep
Options importantes
| Option | Description |
|---|---|
-E | Extended regex (ERE) |
-P | Perl regex (PCRE) |
-i | Insensible à la casse |
-v | Inverser (lignes sans match) |
-o | Afficher seulement le match |
-n | Afficher les numéros de ligne |
-c | Compter les matchs |
Exemples pratiques
# Email (simplifié)
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" fichier.txt
# Adresse IP
grep -E "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b" fichier.txt
# Numéro de téléphone (format FR)
grep -E "0[1-9][0-9]{8}" fichier.txt
# URL
grep -E "https?://[a-zA-Z0-9./?=_-]+" fichier.txt
# Lignes avec des erreurs
grep -E "(error|fail|fatal)" -i log.txt
Extraire des informations
# Extraire tous les emails
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" fichier.txt
# Extraire les IPs
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" log.txt
# Compter les occurrences
grep -c "ERROR" log.txt
# Fichiers contenant un pattern
grep -l "TODO" *.py
🔝 Retour à la table des matières
6 - Regex avec sed et awk
sed avec regex
# Substitution basique
sed 's/[0-9]\+/NUMBER/g' fichier.txt
# Capture et réutilisation
sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2 \1/' fichier.txt
# Supprimer les lignes avec pattern
sed '/^#/d' fichier.txt
# Garder seulement les lignes avec pattern
sed -n '/error/p' fichier.txt
awk avec regex
# Lignes matchant un pattern
awk '/error/ {print}' log.txt
# Négation
awk '!/^#/ {print}' fichier.txt
# Match sur un champ spécifique
awk '$3 ~ /error/ {print}' log.txt
# Ne match pas
awk '$3 !~ /success/ {print}' log.txt
Regex en Bash
#!/bin/bash
email="[email protected]"
regex="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
if [[ $email =~ $regex ]]; then
echo "Email valide"
echo "Match complet: ${BASH_REMATCH[0]}"
else
echo "Email invalide"
fi
Captures en Bash
#!/bin/bash
ligne="Date: 2024-01-15"
if [[ $ligne =~ Date:\ ([0-9]{4})-([0-9]{2})-([0-9]{2}) ]]; then
echo "Année: ${BASH_REMATCH[1]}"
echo "Mois: ${BASH_REMATCH[2]}"
echo "Jour: ${BASH_REMATCH[3]}"
fi
🔝 Retour à la table des matières
7 - Exercices pratiques
Exercice 1 : Valider un email
# Créez une fonction qui valide un email
Solution
valider_email() {
local email="$1"
local regex="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
if [[ $email =~ $regex ]]; then
return 0
else
return 1
fi
}
valider_email "[email protected]" && echo "Valide"
valider_email "invalid" || echo "Invalide"
Exercice 2 : Extraire des IPs
# Extrayez toutes les adresses IP uniques d'un fichier log
Solution
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" log.txt | sort -u
Quiz
Q1. Quelle regex matche les lignes commençant par un chiffre ?
Réponse
^[0-9] ou ^[[:digit:]]
Q2. Comment rendre une regex insensible à la casse avec grep ?
Réponse
grep -i "pattern" fichier
Q3. Comment utiliser les regex étendues avec sed ?
Réponse
sed -E 's/pattern/replacement/g' ou sed -r sur certains systèmes
🔝 Retour à la table des matières
Points clés à retenir
.= tout caractère,^= début,$= fin[abc]= classe,[^abc]= négation*= 0+,+= 1+,?= 0-1,{n,m}= entre n et mgrep -Epour regex étendues (ERE)[[ $var =~ regex ]]pour tester en Bash${BASH_REMATCH[n]}pour les captures- Toujours tester vos regex sur des données de test !
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Gestion des erreurs →