Aller au contenu principal

Expressions régulières


Table des matières

  1. Introduction aux regex
  2. Syntaxe de base
  3. Quantificateurs
  4. Classes et groupes
  5. Regex avec grep
  6. Regex avec sed et awk
  7. 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

TypeOutilsSyntaxe
BREgrep, sedBasique, échappement pour +, ?
EREgrep -E, awkÉtendue, +, ?, | natifs
PCREgrep -PPerl-compatible, lookahead

Où utiliser les regex

  • grep : recherche dans des fichiers
  • sed : substitution de texte
  • awk : 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èreSignification
.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

QuantificateurSignificationExemple
*0 ou plusab*c → ac, abc, abbc
+1 ou plusab+c → abc, abbc (pas ac)
?0 ou 1ab?c → ac, abc
{n}Exactement na{3} → aaa
{n,}n ou plusa{2,} → aa, aaa, aaaa...
{n,m}Entre n et ma{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

OptionDescription
-EExtended regex (ERE)
-PPerl regex (PCRE)
-iInsensible à la casse
-vInverser (lignes sans match)
-oAfficher seulement le match
-nAfficher les numéros de ligne
-cCompter 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 m
  • grep -E pour 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 →