FreeToGenerate.com

100 % gratuit · sans inscription · rien ne quitte votre navigateur

Tout s’exécute dans votre navigateur — le motif et le texte ne sont jamais envoyés nulle part.

Aussi disponible en : English · Español · Português · العربية

Testeur d’expression régulière (regex) en ligne

Collez un motif et un texte, et voyez tout de suite ce qui correspond, groupe par groupe.

Qu’est-ce qu’un testeur d’expression régulière ?

Un testeur d’expression régulière (ou testeur de regex) exécute un motif contre un texte et affiche instantanément ce qui correspond, sans écrire une ligne de code ni ouvrir la console du navigateur. Ici, le champ Motif accepte un motif nu comme ^\d+$ aussi bien qu’un littéral JavaScript collé tel quel, comme /^\d+$/gi — l’outil détecte les drapeaux placés après le dernier slash et coche les cases correspondantes. Huit interrupteurs couvrent les huit drapeaux du moteur JavaScript (g, i, m, s, u, v, y, d), une zone de texte reçoit la chaîne à tester, et un champ de remplacement facultatif complète l’ensemble.

À chaque frappe, le résultat se met à jour : le nombre de correspondances et le temps de recherche en millisecondes, le texte de test avec chaque correspondance surlignée directement dedans, un tableau détaillant pour chaque correspondance sa position, le texte trouvé, ses groupes de capture numérotés et ses groupes nommés, et enfin le résultat du remplacement, qui comprend les références $1, $<nom> et $&. Rien n’est calculé au clic : tester une regex ici veut dire voir le motif se comporter en temps réel pendant qu’on l’écrit.

L’outil affiche aussi quelles fonctionnalités récentes de regex le navigateur du lecteur prend réellement en charge — lookbehind, groupes nommés, échappements de propriétés Unicode, drapeau d, drapeau v — détectées à l’exécution plutôt qu’annoncées de mémoire, puisque le support varie encore d’un navigateur et d’une version à l’autre.

Comment l’utiliser

  1. Collez le motif et cochez les drapeaux. Le champ Motif accepte un motif nu (^\d+$) ou un littéral JavaScript complet (/^\d+$/gi) dont les drapeaux finaux sont lus automatiquement. Les huit cases g, i, m, s, u, v, y, d restent ensuite disponibles pour ajuster le comportement à la main.
  2. Collez le texte à tester. Chaque correspondance apparaît surlignée directement dans le texte, avec le nombre de correspondances et le temps de recherche en millisecondes affichés au-dessus. Le tableau détaille position, texte trouvé, groupes numérotés et groupes nommés pour chacune.
  3. Ajoutez un remplacement pour voir le résultat final. Le champ Remplacement, facultatif, comprend $1, $<nom> et $& ; le résultat se met à jour à chaque caractère tapé. Un bouton copie ce résultat en un clic.

Pourquoi un mauvais motif peut faire tomber un serveur

Un motif comme /^(a+)+$/ applique un quantificateur à un groupe qui contient lui-même un quantificateur. Face à une chaîne qui ne correspond finalement pas — par exemple des lettres a suivies d’un point d’exclamation — le moteur doit essayer toutes les façons de répartir ces lettres entre le + externe et le + interne avant de conclure à l’échec, et ce nombre de répartitions croît de façon exponentielle avec la longueur de la chaîne. Le problème n’est pas seulement la lenteur : une fois lancé, rien sur ce fil d’exécution ne peut interrompre ce travail, ni minuteur ni vérification entre deux itérations, parce que le contrôle ne revient jamais à votre code tant que le moteur n’a pas fini d’explorer — ou n’a pas été arrêté de l’extérieur.

Les chiffres mesurés sur ce motif, avec le même moteur JavaScript que celui de Chrome, donnent la mesure du problème : 22 lettres a suivies d’un point d’exclamation prennent 19 millisecondes, 24 lettres 73 millisecondes, 26 lettres 293 millisecondes, 28 lettres 1 170 millisecondes. Chaque lettre supplémentaire double à peu près le travail à effectuer. En extrapolant ce doublement — et c’est une extrapolation, pas une mesure —, une chaîne de 38 lettres prendrait de l’ordre de vingt minutes rien que pour ce test unique.

Le contraste avec /^a+$/ montre que le problème vient du motif, pas de la taille du texte : le même travail apparent, sans quantificateur imbriqué, sur 100 000 lettres a, a été mesuré à 0,12 milliseconde. Aucune longueur de texte n’est dangereuse en soi ; seule la structure du motif — un quantificateur qui porte sur un groupe lui-même quantifié — l’est.

C’est exactement pour cette raison que la recherche tourne ici dans un Web Worker plutôt que sur le fil principal : le seul moyen de rester réactif face à un motif qui ne termine jamais est de l’exécuter ailleurs et de pouvoir arrêter ce fil de l’extérieur, ce qu’un minuteur classique ne permettrait pas puisque le contrôle ne lui revient jamais. Un motif encore en cours après 2 secondes est donc arrêté et signalé, au lieu de figer l’onglet — vous pouvez taper vous-même le motif qui bloque et voir la coupure se produire sans risque. Certains moteurs traitent le problème à la racine plutôt qu’en aval : Go et son moteur RE2 ne prennent pas du tout en charge les références arrière et ne peuvent, en échange, jamais rebrousser chemin de façon catastrophique — un compromis qui pousse certains systèmes à refuser purement et simplement cette fonctionnalité.

Limites assumées

Cet outil teste des regex JavaScript, puisqu’il tourne dans le navigateur du lecteur avec le moteur de ce navigateur — les résultats font autorité pour JavaScript et ne sont qu’indicatifs pour tout autre langage. Or la variante JavaScript est réellement privée de fonctionnalités présentes ailleurs : pas de groupes atomiques, pas de quantificateurs possessifs, pas de récursivité, pas d’ancres \A ni \z, pas de conditionnels. Un motif copié depuis une réponse écrite pour PCRE, Python ou Perl peut donc tout simplement refuser de compiler ici, sans que ce soit un bug de l’outil.

Le point sans le drapeau u correspond à des unités UTF-16, si bien qu’un emoji comme le pouce levé compte pour 2 correspondances ; avec u activé, il compte pour 1 seule. Mais le drapeau u ne donne pas non plus des caractères au sens où on l’entend d’habitude : l’emoji famille (homme, femme, fille, garçon liés par des joints) est composé de 7 points de code et reste pourtant un seul groupe de graphèmes visuel, que u soit actif ou non.

\d en JavaScript est purement ASCII : il ne correspond pas aux chiffres arabes orientaux comme ٣٤, alors que \p{Nd} avec le drapeau u les reconnaît. \w souffre d’un défaut comparable et concret en français : il n’inclut ni les voyelles accentuées ni le ç, si bien qu’un motif comme \w+ découpe été et français en plusieurs morceaux au lieu d’un seul mot.

Deux pièges classiques restent à connaître en dehors de l’outil lui-même. D’abord, une regex portant le drapeau g conserve une propriété lastIndex entre les appels : réutiliser le même objet regex pour appeler .test() plusieurs fois sur la même chaîne renvoie tour à tour true, false, true, false, ce qui surprend presque tout le monde une fois. Ensuite, un motif capable de correspondre à la chaîne vide, comme /a*/g, casse la boucle de recherche naïve des manuels, puisque la position n’avance jamais sur une correspondance vide et qu’il faut l’avancer à la main — d’un point de code entier si le drapeau u est actif, sinon elle atterrit entre les deux moitiés d’une paire de substitution où plus rien ne peut correspondre. Cet outil, de son côté, plafonne la liste affichée à 1 000 correspondances et arrête toute recherche encore active après 2 secondes.

Pourquoi est-ce gratuit ?

Tout le calcul a lieu sur l’appareil du lecteur : le moteur de recherche regex est celui déjà intégré à votre navigateur, exécuté dans un Web Worker local, et rien — ni le motif, ni le texte de test, ni le résultat du remplacement — n’est jamais envoyé à un serveur. Il n’y a ni compte à créer, ni filigrane sur le résultat, ni limite artificielle au nombre d’essais.

C’est ce qui rend l’outil gratuit sans contrepartie cachée : faire tourner une regex sur votre propre machine ne coûte rien à personne d’autre que vous, contrairement à un service qui recevrait vos motifs et vos textes sur ses propres serveurs. Ça permet aussi de tester sans réserve des textes sensibles — adresses e-mail, numéros, données personnelles servant à vérifier un motif de validation — puisqu’ils ne quittent à aucun moment votre navigateur.