Testeur de regex

Testez vos expressions régulières JavaScript sur votre propre texte, avec surbrillance des correspondances en direct et aperçu du remplacement.

Cette page a été traduite de l'anglais avec l'aide de l'IA, puis vérifiée par rapport à l'original. Lire la version anglaise

Drapeaux
  • Gratuit — Aucune inscription requise
  • Instantané — Les résultats s'affichent au fur et à mesure
  • Privé — Traité dans votre navigateur

Une expression régulière qui marche dans votre tête et une expression qui marche sur des données réelles sont souvent deux motifs bien différents. Ce testeur compile votre motif avec le moteur RegExp de votre propre navigateur, surligne chaque correspondance dans le texte que vous collez, liste les groupes capturants et prévisualise un remplacement : chaque essai ne vous coûte qu’une frappe au clavier, pas un déploiement.

Comment ça marche

Saisissez le motif sans les barres obliques qui l’entourent et cochez les drapeaux dont vous avez besoin. Le motif est compilé avec new RegExp(pattern, flags) ; en cas d’erreur de syntaxe, le message du moteur s’affiche aussitôt. À mesure que vous modifiez le texte à tester, les correspondances sont trouvées avec String.matchAll, surlignées dans le texte et listées avec leur index de départ et leurs groupes capturants. Les groupes nommés comme (?<year>\d{4}) sont eux aussi capturés.

La liste des correspondances cherche toujours de façon globale, même quand le drapeau g n’est pas coché, car une liste d’une seule correspondance n’a pas grand intérêt. La recherche s’arrête après 500 correspondances, et la liste sous le surlignage affiche les 50 premières. La prévisualisation du remplacement se comporte différemment : elle appelle String.replace avec vos drapeaux exactement tels que vous les avez choisis. Sans g, seule la première occurrence est donc remplacée, comme le fera votre code. La chaîne de remplacement accepte $1, $<name>, $& pour la correspondance entière et $$ pour un signe dollar littéral.

Tout s’exécute dans votre navigateur ; ni le texte ni les motifs ne sont envoyés où que ce soit.

Les drapeaux

  • g n’agit ici que sur la prévisualisation du remplacement, mais dans le code il amène aussi test et exec à mémoriser leur position d’un appel à l’autre, ce qui explique souvent des résultats qui alternent entre vrai et faux.
  • i ignore la casse. Combiné à u, il applique aussi correctement l’équivalence de casse Unicode.
  • m fait correspondre ^ et $ aux limites de chaque ligne, et non plus seulement aux extrémités de la chaîne entière.
  • s permet à . de correspondre aux sauts de ligne, ce qu’il ne fait pas par défaut.
  • u active le mode Unicode : échappements \u{1F600}, classes de propriétés \p{Letter} et traitement correct des caractères situés hors du plan multilingue de base, qui sinon sont vus comme deux unités.
  • y ancre chaque correspondance à la position où s’est terminée la précédente.

JavaScript, un dialecte à part

Les motifs repris de grep, sed, Python ou Java fonctionnent la plupart du temps, mais pas toujours. JavaScript connaît le lookahead et le lookbehind, les quantificateurs non gourmands, les groupes nommés et les propriétés Unicode. Il ne connaît en revanche ni les quantificateurs possessifs, ni les groupes atomiques, ni les ancres \A et \Z, ni les classes POSIX comme [[:digit:]], et il refuse le modificateur (?i) appliqué à tout le motif (la forme à portée limitée (?i:…) ne fonctionne que dans les moteurs récents). Les références arrière s’écrivent \1 dans le motif et $1 dans le remplacement, et non \1 dans les deux comme avec sed.

Les correspondances de largeur nulle sont légitimes : a* correspond à la chaîne vide à chaque position de bbb, ce qui explique qu’un motif mal ancré puisse annoncer plus de correspondances qu’il n’y a de caractères. Le surligneur les matérialise par de fines marques pour que vous voyiez où elles tombent.

Le backtracking catastrophique

Des quantificateurs imbriqués sur des classes qui se recouvrent, par exemple (\w+\s?)+$ appliqué à une longue ligne qui ne se termine pas comme prévu, poussent le moteur à essayer un nombre exponentiel de chemins. Dans cet outil, le symptôme est un onglet figé ; en production, c’est un déni de service déclenché par une seule entrée malveillante. Préférez des classes de caractères précises à .*, évitez de quantifier un groupe qui contient déjà un quantificateur, et ancrez vos motifs pour que l’échec soit détecté tôt.

L’équivalent en ligne de commande

L’équivalent le plus proche de la liste des correspondances est grep -oE, qui affiche chaque correspondance sur sa propre ligne ; notez que grep utilise la syntaxe POSIX étendue et non celle de JavaScript :

grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' access.log | sort | uniq -c

Pour aller plus loin

Le guide sur la manipulation de texte avec grep, sed et awk présente les dialectes POSIX et ce qui distingue leur syntaxe de celle que vous testez ici. Côté langage, les fondamentaux de JavaScript expliquent les méthodes de chaîne qui exploitent ces motifs et comment les fonctions de rappel passées à replace offrent plus de contrôle qu’une chaîne de remplacement. Si vos données sont du JSON plutôt que du texte libre, le formateur JSON les indentera proprement pour que vos motifs orientés lignes aient prise.

FAQ

Quel moteur de regex est utilisé ici ?
Le moteur RegExp natif de JavaScript — le même que celui utilisé par String.match, String.replace et tous les navigateurs et environnements Node.js.
Pourquoi la liste des correspondances en montre-t-elle plus que ce que j'attendais ?
La liste des correspondances recherche toujours globalement afin d'afficher chaque occurrence, que vous ayez coché ou non le drapeau g. Le drapeau g continue de déterminer si l'aperçu de remplacement modifie une seule correspondance ou toutes, conformément au comportement réel de .replace().
Mon texte est-il envoyé quelque part ?
Non. La recherche de correspondances s'effectue entièrement dans votre navigateur.