man regex
Regex — Cheat Sheet
Référence rapide des expressions régulières — syntaxe universelle, PCRE, et usages dans les outils Linux courants.
Référence rapide des expressions régulières — syntaxe universelle, PCRE, et usages dans les outils Linux courants.
Ancres et positions
| Expression | Description | Exemple | Correspond à |
|---|---|---|---|
^ |
Début de ligne | ^Bonjour |
Bonjour monde |
$ |
Fin de ligne | monde$ |
Bonjour monde |
\b |
Frontière de mot | \bcat\b |
cat mais pas catch |
\B |
Non-frontière | \Bcat\B |
scatter (cat interne) |
\A |
Début de chaîne (PCRE) | \ADebut |
Début absolu |
\Z |
Fin de chaîne (PCRE) | fin\Z |
Fin absolue |
Classes de caractères
| Expression | Description |
|---|---|
. |
N’importe quel caractère (sauf newline) |
\d |
Chiffre ([0-9]) |
\D |
Non-chiffre ([^0-9]) |
\w |
Alphanumérique + underscore ([a-zA-Z0-9_]) |
\W |
Non-alphanumérique |
\s |
Espace blanc (espace, tab, newline) |
\S |
Non-espace blanc |
\t |
Tabulation |
\n |
Saut de ligne |
\r |
Retour chariot |
Classes personnalisées
[abc] # a, b ou c[^abc] # ni a, ni b, ni c[a-z] # toute lettre minuscule[A-Z] # toute lettre majuscule[0-9] # tout chiffre[a-zA-Z0-9] # tout alphanumérique[a-z&&[^aeiou]] # consonnes (Java/Perl)[\u00C0-\u017E] # lettres latines étendues (Unicode)Le point `.` ne correspond pas aux newlines
En mode multi-ligne, utiliser le flag s (PCRE: (?s)) pour que . corresponde à tout caractère y compris \n.
Quantificateurs
| Expression | Description | Exemple | Correspond à |
|---|---|---|---|
* |
0 ou plusieurs | ab*c |
ac, abc, abbc |
+ |
1 ou plusieurs | ab+c |
abc, abbc (pas ac) |
? |
0 ou 1 (optionnel) | colou?r |
color, colour |
{n} |
Exactement n fois | \d{4} |
2024 |
{n,} |
Au moins n fois | \d{2,} |
12, 123, 1234 |
{n,m} |
Entre n et m fois | \d{2,4} |
12, 123, 1234 |
Quantificateurs paresseux (non-greedy)
Par défaut, les quantificateurs sont greedy (prennent le maximum possible).
.* # greedy : prend le plus possible.*? # lazy : prend le moins possible.+? # lazy.{2,5}? # lazy
# Exemple avec <b>texte</b><b>autre</b><b>.*</b> # → <b>texte</b><b>autre</b> (greedy, trop)<b>.*?</b> # → <b>texte</b> (lazy, correct)Groupes et alternance
(abc) # groupe capturant(?:abc) # groupe non capturant (plus performant)(?P<nom>abc) # groupe nommé (Python/PCRE)(?<nom>abc) # groupe nommé (PCRE/.NET)
cat|dog # alternance : cat OU dog(cat|dog) food # (cat food) ou (dog food)
# Références arrière (backreferences)(\w+)\s\1 # mot répété (ex: "le le")(?P<mot>\w+)\s(?P=mot) # avec groupe nommé (Python)Lookahead et lookbehind
# Lookahead positif : suivi de ...\d+(?= euros) # chiffres suivis de " euros"
# Lookahead négatif : NON suivi de ...\d+(?! euros) # chiffres NOT suivis de " euros"
# Lookbehind positif : précédé de ...(?<=\$)\d+ # chiffres précédés de "$"
# Lookbehind négatif : NON précédé de ...(?<!\$)\d+ # chiffres NOT précédés de "$"Lookaround = zéro largeur
Les lookahead/lookbehind ne consomment pas de caractères. Ils vérifient le contexte sans en faire partie du match.
Flags / Modificateurs
| Flag | PCRE | Python | Description |
|---|---|---|---|
| Insensible casse | (?i) |
re.I |
ABC ↔ abc |
| Multi-ligne | (?m) |
re.M |
^/$ sur chaque ligne |
| Dotall | (?s) |
re.S |
. matche aussi \n |
| Verbose | (?x) |
re.X |
Espaces et commentaires ignorés |
| Unicode | (?u) |
re.U |
\w, \d étendus à Unicode |
# Inline flags (PCRE)(?i)hello # insensible à la casse depuis ici(?im)^hello$ # multi-flag
# Mode verbose (commentaires dans la regex)(?x) \d{4} # année [-/] # séparateur \d{2} # mois [-/] \d{2} # jourCaractères spéciaux à échapper
Les caractères suivants ont une signification spéciale et doivent être échappés avec \ :
. * + ? ^ $ { } [ ] | ( ) \www\.example\.com # matcher un point littéral\(texte\) # matcher des parenthèses littérales\d+\.\d+ # nombre décimal (ex: 3.14)Patterns courants
Validation de formats
# Email (simplifié)^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
# IPv4^(\d{1,3}\.){3}\d{1,3}$
# IPv4 stricte (0-255)^(25[0-5]|2[0-4]\d|[01]?\d\d?)(\.(25[0-5]|2[0-4]\d|[01]?\d\d?)){3}$
# IPv6 (simplifiée)^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
# URL^https?://[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$
# Date ISO 8601 (YYYY-MM-DD)^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
# Heure (HH:MM:SS)^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$
# Numéro de téléphone belge^(\+32|0)(4[5-9]\d|[1-9]\d)\d{6}$
# Code postal belge^[1-9]\d{3}$
# CIDR^(\d{1,3}\.){3}\d{1,3}\/([0-9]|[1-2][0-9]|3[0-2])$
# UUID v4^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
# Hash SHA-256^[a-f0-9]{64}$
# Adresse MAC^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$Extraction et nettoyage
# Lignes vides^\s*$
# Espaces en début/fin de ligne^\s+|\s+$
# Balises HTML<[^>]+>
# Commentaires C/C++//.*$|/\*[\s\S]*?\*/
# Adresses IP dans un log\b\d{1,3}(?:\.\d{1,3}){3}\b
# Numéros de version sémantiquev?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?
# Chemins Unix(/[\w.-]+)+/?
# Variables d'environnement\$\{?[A-Z_][A-Z0-9_]*\}?Usage dans les outils Linux
grep
grep -E "regex+" # ERE (Extended Regular Expressions)grep -P "regex(?=lookahead)" # PCRE (Perl-Compatible)grep -G "regex\+" # BRE (Basic, défaut) — + doit être échappégrep -F "chaine.fixe" # chaîne fixe, pas de regex
grep -E "^(ERROR|WARN)" app.log # lignes d'erreur ou warninggrep -P "(\d{1,3}\.){3}\d{1,3}" access.log # IPs dans un loggrep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" # extraire les IPssed
sed 's/pattern/remplacement/' # BRE par défautsed -E 's/pattern+/remplacement/' # EREsed -E 's/(groupe1)(groupe2)/\2\1/' # inverser deux groupessed -n '/^ERROR/p' # afficher les lignes matchantsed '/^#/d' # supprimer les commentairessed -E 's/[[:space:]]+/ /g' # compresser les espacesawk
awk '/^ERROR/ {print $0}' # lignes matchantawk '!/^#/ {print $1, $3}' # exclure les commentairesawk -F: '$3 > 1000 {print $1}' # utilisateurs avec UID > 1000awk 'NR%2==0' # lignes pairesfind
find . -regex ".*\.log\.[0-9]+" # fichiers de log archivésfind . -iregex ".*\.(jpg|png|gif)" # images (insensible casse)PCRE — Syntaxe avancée
# Assertions conditionnelles(?(condition)oui|non)
# Possession (atomic groups — PCRE2)\d++ # chiffres, pas de backtrack[a-z]++ # lettres, pas de backtrack
# Reset de numérotation de groupe(?|(\d+)|([a-z]+)) # les deux alternatives partagent le groupe 1
# Récursion (PCRE2)(?P<expr>\d+|\((?P>expr)[+\-*/](?P>expr)\))
# Unicode properties\p{Lu} # lettre majuscule Unicode\p{Ll} # lettre minuscule Unicode\p{N} # tout chiffre Unicode\p{L} # toute lettre Unicode\P{L} # tout ce qui N'EST PAS une lettreBonnes pratiques
- Toujours tester les regex avec des données réelles avant de les utiliser en production.
- Préférer les groupes non-capturants
(?:...)quand la capture n’est pas nécessaire (performance). - Éviter les patterns catastrophiques comme
(a+)+qui causent du backtracking exponentiel. - Documenter les regex complexes avec des commentaires (flag
(?x)). - Utiliser des outils de test visuels pour les regex complexes.
# Outils de testecho "test string" | grep -P "votre_regex" # tester avec grepecho "test" | sed -E 's/pattern/replacement/' # tester avec sed
# Débogage Pythonpython3 -c "import repattern = r'votre_regex'text = 'votre texte'm = re.search(pattern, text)print(m.groups() if m else 'Pas de match')"Performance
Les quantificateurs greedy imbriqués (.*)* peuvent provoquer un ReDoS (Regular Expression Denial of Service). Préférer les quantificateurs possessifs ou les groupes atomiques quand disponibles.