💻 Développement

dev-regex-builder

Construit, explique et teste des expressions régulières pas à pas.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-regex-builder --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-regex-builder -Launch"

🚀 Déjà installé ?

claude "/dev-regex-builder"

Ou tapez /dev-regex-builder dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

regexexpression régulièrepattern matchingcomment matchervalider un email

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-regex-builder ~/.claude/skills/

Payload du plugin : skills/dev-regex-builder · source éditable : dev-skills/regex-builder

📖 Manuel

Regex Builder

Étape 1 — Cadrage rapide

Avant d'écrire quoi que ce soit, collecter :

QuestionPourquoi
Exemples valides (≥3)Définir le périmètre positif
Exemples invalides (≥3)Éviter les faux positifs
Langage cibleDialecte regex différent (PCRE, RE2, Java…)
Opération : validation / extraction / remplacement / splitImpact sur les groupes et flags
Données unicode ? Multilignes ?Flags u, s, m à activer

Si le besoin n'est pas précis, poser exactement ces questions — pas plus.


Étape 2 — Choisir le bon dialecte

LangageMoteurParticularités
Python rePCRE-like(?P<name>…) pour groupes nommés ; pas de lookbehind variable
Python regex (tiers)PCRE2Lookbehind variable, Unicode complet
JavaScriptRE2-likePas de lookbehind avant ES2018 ; flag v (ES2024) pour sets
PHP preg_*PCRE\K reset match, lookbehind variable
Javajava.util.regex\p{L} pour lettres Unicode, possessifs ++
GoRE2Pas de lookahead/lookbehind, pas de backreferences
.NET.NET RegexGroupes balancés (?<n-m>), LINQ Regex.Matches
Règle : si le moteur est RE2 (Go, Rust regex crate), oublier lookahead et backreferences.

Étape 3 — Construction par blocs

Construire incrémentalement : commencer par le cas le plus simple, ajouter la complexité.

Briques de base

# Ancres
^           début de chaîne (ou de ligne avec /m)
$           fin de chaîne
\b          frontière de mot

# Classes
\d          [0-9]
\w          [a-zA-Z0-9_]
\s          espace, tab, newline
[a-z]       classe personnalisée
[^abc]      négation

# Quantificateurs
?           0 ou 1   (greedy)
*           0+       (greedy)
+           1+       (greedy)
{n,m}       entre n et m
?? *? +?    lazy (prend le moins possible)
?+ *+ ++    possessif (jamais backtrack) — PCRE uniquement

# Groupes
(abc)       groupe capturant
(?:abc)     groupe non-capturant  ← préférer si pas besoin de capture
(?<name>…)  groupe nommé
(?=…)       lookahead positif
(?!…)       lookahead négatif
(?<=…)      lookbehind positif
(?<!…)      lookbehind négatif

Exemples concrets copiables

Email simple (validation formulaire)

^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$

Numéro de téléphone tunisien

^(?:\+?216)?[2-9]\d{7}$

UUID v4

^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

Extraction d'un montant (ex. 12 345,67 TND)

(\d{1,3}(?:[  ]\d{3})*(?:[,.]\d{2})?)(?:\s*(?:TND|EUR|USD))?

Remplacement de variables ${VAR} dans un template

import re
result = re.sub(r'\$\{(\w+)\}', lambda m: env.get(m.group(1), m.group(0)), template)

Étape 4 — Table de tests systématique

Toujours présenter avec résultat attendu ET résultat réel :

EntréeAttenduMatch ?Remarque
cas valide 1cas nominal
cas valide 2variante
cas limite✅/❌edge case
cas invalide 1faux positif potentiel

Commande de test rapide :

# Python
python3 -c "import re; pattern=r'^…$'; tests=['ok','ko']; [print(t, bool(re.fullmatch(pattern,t))) for t in tests]"

# Node.js
node -e "const r=/^…$/; ['ok','ko'].forEach(t=>console.log(t, r.test(t)))"

# grep (POSIX ERE)
echo "test_string" | grep -E '^…$'

Étape 5 — Variantes et alternatives

Proposer systématiquement :

  1. Version stricte : anchors ^…$, pas de quantificateurs greedy larges
  2. Version extraction : groupes nommés, pas d'anchors
  3. Alternative non-regex : si la logique peut être plus claire avec du code
# Préférer ça plutôt qu'une regex monstrueuse :
def is_valid_iban(s):
    s = s.replace(' ', '').upper()
    return len(s) >= 15 and s[:2].isalpha() and s[2:4].isdigit()

Garde-fous et anti-patterns

Pièges classiques

PiègeSymptômeCorrection
Greedy .*Capture trop (jusqu'au dernier match)Utiliser .*? (lazy) ou [^X]+
Oublier d'échapper .. matche n'importe quel caractère\. pour un point littéral
Backtracking catastrophiqueTimeout / freeze sur longues chaînesÉviter (a+)+, utiliser possessif ou atomic group
Négliger les flagsCase-sensitive par défautAjouter re.IGNORECASE / /i explicitement
Backreference dans RE2/GoErreur runtimeRéécrire sans backreference
Valider un email avec RFC complèteRegex de 6 Ko, maintenable zéroValider format basique + vérifier MX côté serveur
^ et $ en multilineComportement différent avec flag mUtiliser \A / \Z (Python) pour vrai début/fin de chaîne

Backtracking catastrophique — détection

# DANGEREUX — éviter
(a|aa)+$
(\w+\s?)+$

# SÛRS — préférer
\w+(\s\w+)*$

Quand ne PAS utiliser une regex


Bonnes pratiques 2026

pattern = re.compile(r"""
    ^                   # début
    (?P<country>\+?\d{1,3})?  # indicatif pays optionnel
    [\s\-.]?            # séparateur optionnel
    (?P<local>\d{8,10}) # numéro local
    $
""", re.VERBOSE)