À propos de cet outil
Ce testeur applique une expression régulière à un texte en temps réel et surligne chaque correspondance, avec le détail de leur position et de leurs groupes de capture, numérotés ou nommés. Vous pouvez aussi tester un remplacement ($1, $<nom>, $&), choisir un motif prêt à l'emploi (téléphone, code postal, IBAN, e-mail…) et expérimenter sans risque : l'analyse s'exécute dans un processus séparé et s'interrompt automatiquement au bout de deux secondes si l'expression provoque un backtracking catastrophique. Les erreurs de syntaxe sont expliquées en français.
Comment utiliser cet outil
- Saisissez votre expression, ou choisissez un motif courant dans la liste : l'expression, les drapeaux et un texte d'essai sont remplis.
- Cochez les drapeaux utiles : g (toutes les correspondances), i (casse), m (début et fin de ligne), s (le point inclut les retours à la ligne), u (Unicode).
- Collez ou modifiez le texte à tester : les correspondances sont surlignées en alternant deux couleurs, et chacune est détaillée dans le tableau.
- Pour tester une substitution, renseignez le champ « Remplacer par » : le texte transformé s'affiche et peut être copié.
Les briques d'une expression régulière
Une expression régulière (regex ou regexp) décrit un motif de texte : elle permet de chercher, de valider, d'extraire ou de remplacer des morceaux de texte. Elle s'écrit entre deux barres obliques, suivies des drapeaux : /motif/gi. Voici les éléments de base de la syntaxe JavaScript :
| Élément | Signification | Exemple |
|---|---|---|
. | N'importe quel caractère sauf un retour à la ligne (avec le drapeau s, tous). | c.t : « cat », « c7t » |
\d \w \s | Un chiffre ; un caractère de mot [A-Za-z0-9_] ; une espace (y compris l'espace insécable et l'espace fine insécable). | \d\d : « 42 » |
\D \W \S | Le contraire des trois précédents. | \S+ : un « mot » sans espace |
[abc] [^abc] [a-z] | Un caractère parmi ceux-ci ; un caractère qui n'en fait pas partie ; un intervalle. | [aeiou] : une voyelle simple |
\p{L} | Une lettre de n'importe quelle langue (avec le drapeau u). | \p{L}+ : « été », « Noël » |
^ $ | Début et fin du texte (de la ligne avec le drapeau m). | ^\d+$ : que des chiffres |
\b | Frontière de mot (entre un caractère de mot et autre chose). | \bchat\b : « chat » mais pas « chaton » |
* + ? | 0 ou plus ; 1 ou plus ; 0 ou 1 occurrence de l'élément précédent. | colou?r |
{n} {n,} {n,m} | Exactement n ; au moins n ; entre n et m occurrences. | \d{2,4} |
(…) (?:…) | Groupe capturant ; groupe non capturant. | (\d+)€ |
(?<nom>…) \1 | Groupe nommé ; rappel d'un groupe déjà capturé. | (\w+) \1 : un mot répété |
a|b | Alternative : a ou b. | jour|nuit |
(?=…) (?!…) | Assertion avant : suivi de… ; non suivi de… | \d+(?=€) : les chiffres suivis de « € » |
(?<=…) (?<!…) | Assertion arrière : précédé de… ; non précédé de… | (?<=€)\d+ |
Pour écrire littéralement un caractère spécial (. * + ? ( ) [ ] { } ^ $ | \), faites-le précéder d'une barre oblique inverse : \. désigne un vrai point.
Gourmand ou paresseux : la différence qui change tout
Par défaut, les quantificateurs sont gourmands : ils prennent le plus de caractères possible. En ajoutant un point d'interrogation (*?, +?, {n,m}?), ils deviennent paresseux et prennent le moins possible.
Sur le texte <b>gras</b> et <i>italique</i> : l'expression gourmande <.+> trouve une seule correspondance, le texte entier (de la première « < » à la dernière « > »). L'expression paresseuse <.+?> en trouve quatre : <b>, </b>, <i> et </i>. Une classe négative comme <[^>]+> donne le même résultat, souvent plus rapidement.
Regex et langue française : accents, espaces et apostrophes
\wne reconnaît pas les accents.\w+coupe « été » en « t » (le « é » n'est pas un caractère de mot). Utilisez\p{L}+avec le drapeauu, ou une classe explicite comme[a-zA-ZÀ-ÿ]+.\ba la même limite. Les frontières de mots sont calculées sur les caractères ASCII :\bété\bne trouve rien. Remplacez-les par des assertions :(?<!\p{L})été(?!\p{L}).- Les espaces de la typographie française.
\sreconnaît l'espace insécable (U+00A0) et l'espace fine insécable (U+202F) qui précèdent « ; : ! ? » et se trouvent dans les guillemets « ». C'est précieux pour nettoyer un texte, mais une espace ordinaire saisie[ ]ne les trouvera pas. - L'apostrophe. Selon le clavier ou le traitement de texte, l'apostrophe peut être droite (
') ou typographique (’). Pour couvrir les deux :l['’]. - Majuscules et minuscules. Le drapeau
ifait correspondre « é » et « É ». Pour reconnaître spécifiquement une majuscule accentuée, utilisez\p{Lu}avec le drapeauu.
Une regex vérifie une forme, pas une validité
Les motifs courants de l'outil (téléphone, code postal, IBAN, e-mail…) vérifient que le texte ressemble à ce qu'on attend. Ils ne prouvent pas qu'il existe :
- Adresse e-mail. La syntaxe complète définie par la norme RFC 5322 est bien plus permissive (un nom local entre guillemets peut contenir des espaces) que n'importe quelle regex raisonnable. La spécification HTML elle-même reconnaît que sa définition d'une adresse « valide » s'écarte volontairement de la norme. La seule vérification fiable consiste à envoyer un message de confirmation.
- Code postal. Le motif accepte les cinq chiffres de 01 à 98 ; il ne sait pas si le code existe.
- Date. Le motif accepte les jours 01 à 31 et les mois 01 à 12, mais pas le nombre de jours de chaque mois ni les années bissextiles : « 31/02/2026 » passe. Utilisez un calculateur de dates pour vérifier la validité, comme celui de la durée entre deux dates.
- IBAN, SIRET, numéro de carte. Leur validité repose sur une clé de contrôle (modulo 97, algorithme de Luhn) que les regex ne calculent pas. Une regex filtre la forme ; un programme vérifie la clé.
Le backtracking catastrophique (ReDoS)
Pour trouver une correspondance, le moteur de JavaScript explore les possibilités les unes après les autres et revient en arrière (backtracking) quand une piste échoue. Avec certaines expressions, le nombre de pistes explose. L'exemple classique est ^(a+)+$ : sur « aaaa…a! », chaque « a » supplémentaire double le temps de calcul, et quelques dizaines de caractères suffisent à figer le navigateur. C'est le motif « Backtracking catastrophique » de l'outil : l'analyse s'exécute dans un processus séparé et s'interrompt après deux secondes, sans bloquer la page.
Ce risque est bien réel en production, car les regex tournent souvent sur des données fournies par des inconnus :
- Le 20 juillet 2016, Stack Overflow est resté inaccessible pendant 34 minutes : une expression destinée à retirer les espaces en fin de texte a dû examiner un message contenant environ 20 000 espaces consécutifs. Le coût de cette expression croît avec le carré de la longueur, ce qui suffit à saturer des serveurs.
- Le 2 juillet 2019, une règle du pare-feu applicatif de Cloudflare contenant une expression mal construite a épuisé les processeurs de ses serveurs dans le monde entier, provoquant des erreurs 502 pendant 27 minutes. Cloudflare a ensuite adopté un moteur sans backtracking.
Pour s'en protéger : évitez les quantificateurs imbriqués sur des éléments qui peuvent se recouvrir ((a+)+, (\w+\s?)*, (.*)*) ; remplacez les alternatives ambiguës par des classes de caractères précises ; limitez la longueur des textes soumis à une regex ; et, côté serveur, utilisez un moteur à temps linéaire comme RE2, ou imposez un délai maximal d'exécution. L'OWASP détaille ces attaques sous le nom de ReDoS.
Utiliser une regex dans votre code JavaScript
re.test(texte)renvoie vrai ou faux.texte.match(re)renvoie la première correspondance (ou toutes avec le drapeaug),texte.matchAll(re)une série d'objets avec les groupes, ettexte.replace(re, remplacement)oureplaceAllle texte transformé.- Le piège du drapeau
gavectest(). Une regex globale mémorise sa position (lastIndex) :const re = /a/g; re.test('a')renvoietrue, puis un deuxième appel identique renvoiefalse. Créez une nouvelle regex à chaque appel, ou n'utilisez pasgpour un simple test. - Les groupes nommés rendent le code lisible : avec
(?<jour>\d{2})\/(?<mois>\d{2}), on litm.groups.jouretm.groups.mois. Dans un remplacement, on les rappelle avec$<jour>. - Dans une chaîne JavaScript, la barre oblique inverse doit être doublée quand on utilise
new RegExp("\\d+"). La notation littérale/\d+/évite cette contrainte.
Questions fréquentes
Quelle syntaxe de regex cet outil utilise-t-il ?
Celle de JavaScript (le moteur de votre navigateur). Elle est proche de celle de PCRE, utilisée par PHP ou Python, avec quelques différences : pas de drapeau x (mode étendu), pas de groupes atomiques ni de quantificateurs possessifs, mais les groupes nommés (?<nom>…) et, dans les navigateurs récents, les assertions arrière (?<=…) sont disponibles.
À quoi servent les drapeaux ?
g retourne toutes les correspondances au lieu de la première ; i ignore la casse ; m fait de ^ et $ des repères de début et de fin de ligne ; s permet au point de capturer aussi les retours à la ligne ; u active le mode Unicode, nécessaire pour les propriétés comme \p{L} (toutes les lettres, accents compris) et pour traiter correctement les caractères hors du plan de base, comme les emojis.
Pourquoi \w ne reconnaît-il pas les lettres accentuées ?
Parce que \w désigne uniquement [A-Za-z0-9_]. Pour des mots français, utilisez \p{L} avec le drapeau u, par exemple [\p{L}]+, ou ajoutez les accents explicitement dans une classe de caractères.
Qu'est-ce que le backtracking catastrophique ?
Certaines expressions, comme (a+)+$, essaient un nombre de combinaisons qui double à chaque caractère ajouté : sur un texte un peu long, le navigateur se fige. C'est la base des attaques « ReDoS ». L'outil interrompt l'analyse après deux secondes ; sur un serveur, prévoyez de limiter la longueur des entrées ou d'utiliser un moteur à temps linéaire.
Mon texte est-il envoyé à un serveur ?
Non, l'analyse s'effectue dans votre navigateur, dans un processus séparé (Web Worker) : rien n'est transmis.
Sources et références
- MDN — Expressions régulières (guide JavaScript)
- MDN — Aide-mémoire de la syntaxe des expressions régulières
- OWASP — Regular expression Denial of Service (ReDoS)
- Cloudflare — Details of the Cloudflare outage on July 2, 2019
- Stack Exchange — Outage Postmortem, July 20, 2016
- WHATWG — HTML Standard : adresse e-mail valide (champ input type="email")