Expressions régulières (Regex)
Définition
Une expression régulière (regex) est un motif de recherche qui décrit un ensemble de chaînes de caractères selon des règles syntaxiques précises.
Utilisation
- Validation de formats (email, téléphone, etc.)
- Recherche et remplacement de texte
- Extraction de données
- Analyse lexicale
Syntaxe de base
Caractères littéraux
a: correspond exactement au caractère 'a'abc: correspond exactement à la chaîne "abc"
Métacaractères
| Symbole | Signification | Exemple |
|---|---|---|
. |
N'importe quel caractère | a.c → "abc", "axc", "a1c" |
* |
0 ou plusieurs occurrences | ab*c → "ac", "abc", "abbc" |
+ |
1 ou plusieurs occurrences | ab+c → "abc", "abbc" (pas "ac") |
? |
0 ou 1 occurrence | ab?c → "ac", "abc" |
^ |
Début de chaîne | ^abc → "abc..." |
$ |
Fin de chaîne | abc$ → "...abc" |
\| |
OU logique | a\|b → "a" ou "b" |
Quantificateurs
| Symbole | Signification | Exemple |
|---|---|---|
{n} |
Exactement n occurrences | a{3} → "aaa" |
{n,} |
Au moins n occurrences | a{2,} → "aa", "aaa", "aaaa"... |
{n,m} |
Entre n et m occurrences | a{2,4} → "aa", "aaa", "aaaa" |
Classes de caractères
| Symbole | Signification | Équivalent |
|---|---|---|
[abc] |
Un des caractères a, b ou c | a\|b\|c |
[a-z] |
Lettre minuscule | |
[A-Z] |
Lettre majuscule | |
[0-9] |
Chiffre | \d |
[^abc] |
Tout sauf a, b ou c |
Classes prédéfinies
| Symbole | Signification | Équivalent |
|---|---|---|
\d |
Chiffre | [0-9] |
\D |
Non-chiffre | [^0-9] |
\w |
Caractère de mot | [a-zA-Z0-9_] |
\W |
Non-caractère de mot | [^a-zA-Z0-9_] |
\s |
Espace blanc | [ \t\n\r\f] |
\S |
Non-espace blanc | [^ \t\n\r\f] |
Groupes et captures
| Symbole | Signification | Exemple |
|---|---|---|
(abc) |
Groupe de capture | (ab)+ → "ab", "abab" |
(?:abc) |
Groupe non-capturant | |
\1 |
Référence au groupe 1 | (a)\1 → "aa" |
Exemples pratiques
Validation de formats courants
Numéro de téléphone français
*^0 : commence par 0
* [1-9] : suivi d'un chiffre de 1 à 9
* [0-9]{8} : puis 8 chiffres
* $ : fin de chaîne
Code postal français
* 5 chiffres exactementPlaque d'immatriculation (nouveau format)
* Format : XX-123-XXExtraction de données
Extraire les mots
*\b : frontière de mot
* [a-zA-Z]+ : une ou plusieurs lettres
Extraire les nombres
*\d+ : un ou plusieurs chiffres
* (\.\d+)? : optionnellement un point suivi de chiffres
Validation d'adresse email
Expression régulière simplifiée
Décomposition
Partie locale (avant @)
* Caractères autorisés : lettres, chiffres, point, underscore, %, +, - * Quantificateur :+ (au moins un caractère)
Séparateur
* Caractère obligatoire uniqueNom de domaine
* Caractères autorisés : lettres, chiffres, point, tiret * Quantificateur :+ (au moins un caractère)
Extension
* Point obligatoire :\. (échappé)
* Extension : [a-zA-Z]{2,} (au moins 2 lettres)
Exemples valides
user@example.comtest.email+tag@domain.co.ukuser123@sub.domain.org
Exemples invalides
user@(pas de domaine)@domain.com(pas de partie locale)user@domain(pas d'extension)user..name@domain.com(points consécutifs)
Version plus stricte (RFC 5322 partielle)
Améliorations : * Interdit de commencer/finir par un point ou tiret * Plus conforme aux standards
Exemple d'agrégation interne 2024
Contexte (Figure 20)
Validation d'un identifiant utilisateur avec les contraintes : * Commence par une lettre * Contient uniquement lettres, chiffres et underscore * Longueur entre 3 et 20 caractères
Expression régulière
Décomposition
^: début de chaîne[a-zA-Z]: première lettre obligatoire[a-zA-Z0-9_]{2,19}: 2 à 19 caractères (lettres, chiffres, underscore)$: fin de chaîne
Total : 3 à 20 caractères (1 + 2 à 19)
Exemples
- ✅
user123 - ✅
Admin_User - ✅
a12 - ❌
123user(commence par un chiffre) - ❌
us(trop court) - ❌
user-name(tiret interdit)
Outils et langages
Langages supportant les regex
- Python : module
re - JavaScript : objet
RegExp - Java : classe
Pattern - C# : classe
Regex - PHP : fonctions
preg_*
Exemple en Python
import re
# Validation email
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
email = "user@example.com"
if re.match(email_pattern, email):
print("Email valide")
else:
print("Email invalide")
Exemple en JavaScript
// Validation email
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const email = "user@example.com";
if (emailPattern.test(email)) {
console.log("Email valide");
} else {
console.log("Email invalide");
}
Bonnes pratiques
Performance
- Éviter les quantificateurs gourmands inutiles
- Utiliser des ancres (
^et$) quand nécessaire - Préférer les classes de caractères aux alternatives multiples
Lisibilité
- Commenter les regex complexes
- Utiliser des groupes nommés si supportés
- Diviser les regex très longues
Sécurité
- Attention aux attaques par déni de service (ReDoS)
- Valider la longueur des chaînes en amont
- Éviter les regex avec backtracking excessif
Exemple de regex dangereuse
* Peut causer un backtracking exponentiel * Vulnérable aux attaques ReDoSVersion sécurisée
* Même résultat, complexité linéaireOutils de test
En ligne
- regex101.com : Test et explication détaillée
- regexr.com : Interface interactive
- regexpal.com : Test simple et rapide
Éditeurs
- VSCode : Support natif avec coloration
- Sublime Text : Plugin regex
- Vim : Commandes de recherche/remplacement
Cas d'usage avancés
Validation de mot de passe
* Au moins une minuscule * Au moins une majuscule* Au moins un chiffre * Au moins un caractère spécial * Minimum 8 caractères