man regex

Regex — Cheat Sheet

Référence rapide des expressions régulières — syntaxe universelle, PCRE, et usages dans les outils Linux courants.

Créé le Mis à jour le

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} # jour

Caractè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émantique
v?(\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 warning
grep -P "(\d{1,3}\.){3}\d{1,3}" access.log # IPs dans un log
grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" # extraire les IPs

sed

sed 's/pattern/remplacement/' # BRE par défaut
sed -E 's/pattern+/remplacement/' # ERE
sed -E 's/(groupe1)(groupe2)/\2\1/' # inverser deux groupes
sed -n '/^ERROR/p' # afficher les lignes matchant
sed '/^#/d' # supprimer les commentaires
sed -E 's/[[:space:]]+/ /g' # compresser les espaces

awk

awk '/^ERROR/ {print $0}' # lignes matchant
awk '!/^#/ {print $1, $3}' # exclure les commentaires
awk -F: '$3 > 1000 {print $1}' # utilisateurs avec UID > 1000
awk 'NR%2==0' # lignes paires

find

find . -regex ".*\.log\.[0-9]+" # fichiers de log archivés
find . -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 lettre

Bonnes 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 test
echo "test string" | grep -P "votre_regex" # tester avec grep
echo "test" | sed -E 's/pattern/replacement/' # tester avec sed
# Débogage Python
python3 -c "
import re
pattern = 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.

search.workspace

MINISEARCH / LOCAL
ready
ESC
Saisissez au moins deux caractères.