Testeur de regex
Testez des expressions régulières avec surlignage des correspondances en direct.
À propos de cet outil
Écrivez une expression régulière JavaScript, activez des flags et voyez chaque correspondance surlignée pendant la saisie, avec les groupes de capture et un aperçu du remplacement.
Mode d’emploi
- Saisissez une expression régulière dans le champ du motif, sans les barres obliques qui l’entourent.
- Activez ou désactivez les flags : g pour toutes les correspondances, i pour ignorer la casse, m pour des ancres multilignes, s pour que . corresponde aux sauts de ligne, u pour Unicode.
- Collez un texte de test et voyez chaque correspondance surlignée, avec les groupes de capture listés en dessous.
- Activez Remplacer pour prévisualiser une substitution avec $1, $2 ou $<name>.
Questions
- Quelle variante de regex est utilisée ?
- JavaScript (ECMAScript). Pour les motifs courants, il est très proche de PCRE et de Python, mais la prise en charge du lookbehind, la syntaxe des groupes nommés et certains échappements diffèrent d’un langage à l’autre.
- Comment faire correspondre un point ou un crochet littéral ?
- Échappez-le avec une barre oblique inverse : \. correspond à un point, \( à une parenthèse, \[ à un crochet. Dans une classe de caractères comme [.], la plupart des caractères perdent leur signification spéciale.
- Quelle est la différence entre .* et .*? ?
- .* est gourmand et capture le plus possible ; .*? est paresseux et capture le moins possible. C’est généralement le mode paresseux qu’il vous faut pour extraire du texte entre deux marqueurs.
- Comment fonctionnent les groupes nommés ?
- Écrivez (?<name>...) pour capturer dans un groupe nommé. Sa valeur s’affiche dans les détails de la correspondance et vous pouvez l’utiliser dans un remplacement avec $<name>.
- Pourquoi ma regex correspond-elle à une chaîne vide ?
- Un motif dont tout est facultatif, comme a* ou (\d+)?, peut correspondre à zéro caractère, et il le fait à chaque position où rien de plus long ne convient. Le tableau Détails des correspondances affiche ces correspondances comme (vide). Utilisez + au lieu de *, ou rendez au moins une partie du motif obligatoire.
- Comment utiliser la correspondance entière dans un remplacement ?
- Écrivez $& pour la correspondance entière, $1 et $2 pour les groupes numérotés, $<name> pour les groupes nommés et $$ pour un signe dollar littéral. Par exemple, remplacer \d+ par [$&] entoure chaque nombre de crochets. Activez le flag g pour remplacer toutes les occurrences et pas seulement la première.
- Une regex peut-elle figer le navigateur ?
- Oui. Des quantificateurs imbriqués comme (a+)+ ou (\w+\s?)*$ peuvent provoquer des retours arrière exponentiels sur un texte qui correspond presque, ce qu’on appelle un retour arrière catastrophique (« catastrophic backtracking »). La recherche s’exécute dans l’onglet de votre navigateur, donc la page peut se figer jusqu’à ce que vous la fermiez. Réécrivez le motif pour que chaque caractère ne puisse être capturé que d’une seule façon, par exemple a+ au lieu de (a+)+.
Les flags regex expliqués : g, i, m, s et u
Les flags regex changent le comportement de tout le motif. g (global) trouve toutes les correspondances au lieu de s’arrêter à la première. Sans lui, ce testeur ne surligne que la première correspondance et Remplacer ne modifie que la première occurrence, exactement comme String.replace en JavaScript. i ignore la casse : /error/i correspond donc à Error et à ERROR. m fait correspondre ^ et $ au début et à la fin de chaque ligne, ce qui est indispensable pour tester un motif sur un fichier de journal.
Le flag s, appelé dotall, permet à . de correspondre aussi aux sauts de ligne, si bien que <p>.*?</p> peut s’étendre sur plusieurs lignes. Le flag u active le mode Unicode : les emoji et les autres caractères situés hors du plan multilingue de base comptent pour un seul caractère, les échappements de propriétés Unicode deviennent disponibles, et les échappements inconnus comme \- hors d’une classe de caractères deviennent des erreurs au lieu d’être acceptés silencieusement. Le flag sticky y et le flag d pour les indices de correspondance ne sont pas proposés ici.
Comment tester une regex sur des données réelles ?
Testez une expression régulière sur des exemples réalistes, pas seulement sur le cas idéal. Collez un texte qui contient des valeurs qui doivent correspondre et d’autres qui ne le doivent pas, puis observez le surlignage. Pour une date ISO, commencez par \d\d\d\d-\d\d-\d\d et vérifiez que 2026-11-08 est surligné alors que 2026-1-8 ne l’est pas. Remarquez ensuite que 12026-11-08 correspond encore en partie. Ajouter des limites de mot \b, ou ^ et $ avec le flag m, corrige cela.
Le tableau Détails des correspondances liste chaque correspondance avec son index et ses groupes de capture, numérotés $1, $2 et ainsi de suite, ainsi que les groupes nommés par leur nom : c’est le moyen le plus rapide de vérifier qu’un groupe capture bien ce que vous attendez. Pour les adresses e-mail, acceptez qu’aucune regex pratique ne respecte entièrement la RFC : un motif comme [\w.+-]+@[\w-]+\.[\w.-]+ repère les fautes de frappe, et un e-mail de confirmation fait la vraie vérification. Pour décomposer une URL, utilisez plutôt Encodage, décodage et analyse d’URL.
Utiliser une regex testée en JavaScript, en Python et avec grep
Un motif testé ici peut être utilisé tel quel dans un littéral regex JavaScript comme /\d+/g, sans échappement supplémentaire. Si vous le construisez à partir d’une chaîne, comme avec new RegExp() ou dans la plupart des autres langages, chaque barre oblique inverse doit être doublée : \d+ devient "\\d+" dans un littéral de chaîne classique. Les chaînes brutes Python comme r"\d+" et les chaînes entre backticks de Go évitent ce doublement. C’est l’oubli le plus fréquent quand une regex fonctionne dans un testeur mais pas dans le code.
Dans d’autres langages, les flags se placent ailleurs. Python utilise re.IGNORECASE ou un (?i) en ligne, et grep utilise -i pour la casse, avec -E ou -P pour choisir la syntaxe. Le lookbehind diffère aussi : JavaScript accepte un lookbehind de longueur variable, alors que le module re de Python exige une largeur fixe, si bien que (?<=\$|USD )\d+ y échoue. Le Générateur de commandes grep et ripgrep transforme un motif testé en commande prête à l’emploi, avec chaque option expliquée.
Quelque chose ne fonctionne pas, ou un résultat semble faux ? Signaler un problème avec cet outil