Aller au contenu

Regex — Cheat Sheet⚓︎

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 ABCabc
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.