Testeur de regex
Écrivez un motif, regardez-le correspondre à votre texte au fur et à mesure de la saisie, et voyez exactement ce que fait chaque jeton. Groupes de capture, aperçu du remplacement, et vérification de portabilité pour PCRE et Python.
Motif
Votre expression régulière
Écrivez uniquement le corps du motif — pas de barres obliques autour. Tout se met à jour au fur et à mesure de la saisie.
Change uniquement la vérification de portabilité — la correspondance s'exécute toujours sur le moteur JavaScript de votre navigateur.
Préréglages
Texte de test
Texte sur lequel tester
Collez des données réelles — une ligne de log, une config, un export de chat. Rien ne quitte votre navigateur.
794 caractères · 14 lignes
Wespner ops log — node eu-fra-03 Ticket #4821 opened by [email protected], escalated to [email protected]. Billing contact: [email protected] (invoice WX-2026-0917). Panel: https://panel.wespner.eu/server/eu-fra-03/console Mirror: http://mirror.wespner.eu:8080/backups/latest.tar.zst Node IP 185.199.110.153, gateway 10.0.0.1, bad entry 999.1.1.1 in the allowlist. Server UUID 9f2c1a7e-3b44-4d8e-9c21-7a5f0b6e2d13 (instance 550e8400-e29b-41d4-a716-446655440000). Chat export: [12:04] Steve_84: this build is hell to maintain, honestly [12:05] Alex_MC: rotate the panel password and open a shell on the class-4 node [12:06] Steve_84: damn, the ass-end of that config is unreadable [12:07] Notch_Fan: <img src=x onerror=alert(1)> nice try [12:08] Alex_MC: harassment report filed, see /docs/rcon
Groupes de capture
Chaque correspondance, avec ses groupes et positions
Les groupes numérotés viennent des ( ) simples. Les groupes nommés viennent de (?<name>…) et sont listés séparément.
Entrez un motif pour voir les correspondances et leurs groupes de capture.
Mode explication
Ce que fait réellement chaque partie du motif
Lisez de haut en bas — c'est l'ordre dans lequel le moteur le lit. L'indentation montre l'imbrication dans les groupes.
(?<user>Named capturing group “user”, also group number 1. Refer to it as $<user> in a replacement, or \k<user> in the pattern.[\w.+-]Any single character that is a word character (letter, digit or underscore), “.”, “+” or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.@The character “@”, matched literally.(?<domain>Named capturing group “domain”, also group number 2. Refer to it as $<domain> in a replacement, or \k<domain> in the pattern.(?:Non-capturing group: groups tokens together for a quantifier or an alternation without storing what it matched, so it does not consume a group number.[\w-]Any single character that is a word character (letter, digit or underscore) or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.\.The character “.”, matched literally. The backslash strips any special meaning it would otherwise have.)Closes the group opened above.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.[a-z]Any single character that is anything from “a” to “z”.{2,}Repeats the previous token at least 2 times, with no upper limit. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.giFlags: g finds every match instead of stopping at the first; i ignores letter case.Remplacer
Aperçu d'un rechercher-remplacer
Utilisez $1, $2 pour les groupes numérotés, $<name> pour les groupes nommés, $& pour toute la correspondance et $$ pour un signe dollar littéral.
Résultat
Entrez un motif pour prévisualiser un remplacement.
Note de transparence
Cette page n'exécute ni PCRE ni Python
Il n'y a qu'un seul moteur de regex ici : celui intégré à votre navigateur, qui implémente la variante JavaScript. Choisir PCRE ou Python ne change pas de moteur et ne le peut pas — aucun PCRE ni CPython ne s'exécute dans cet onglet.
Ce que fait le réglage de variante, c'est vérifier votre motif pour des constructions qui s'écrivent différemment, se comportent différemment, ou n'existent tout simplement pas dans la variante choisie. Considérez les correspondances ci-dessus comme des résultats JavaScript, et la liste à droite comme « ce qui vous mordra quand vous coller ceci dans PHP ou Python ».
Appel équivalent
const re = /(?<user>[\w.+-]+)@(?<domain>(?:[\w-]+\.)+[a-z]{2,})/gi;
for (const m of text.matchAll(re)) console.log(m);A literal is fine when the pattern is fixed. Building one from a variable needs new RegExp(src, flags) — and the source escaped first.
Vérification de portabilité
Portabilité vers JavaScript
Heuristique — le motif est analysé comme du texte, donc une construction écrite à l'intérieur d'une classe de caractères peut quand même être signalée.
Aide-mémoire
Gourmand contre paresseux
La raison la plus courante pour laquelle un motif « correspond à trop de choses ».
<.*> contre <b>bold</b> correspond à toute la chaîne, pas seulement à <b>. * et + sont gourmands : ils prennent tout ce qu'ils peuvent et ne rendent des caractères que si le reste du motif échoue.
Ajoutez ? pour rendre un quantificateur paresseux — <.*?> s'arrête au premier >. Généralement mieux encore : dites ce que vous voulez vraiment dire, <[^>]*>, qui ne peut pas du tout traverser le délimiteur et ne fait pas de backtracking.
Aide-mémoire
Ancres et limites
^ et $ marquent le début et la fin de la chaîne — jusqu'à ce que vous ajoutiez le flag m, où ils deviennent le début et la fin de chaque ligne. Oublier m sur un fichier de config multi-lignes explique pourquoi un motif par ligne ne correspond silencieusement à rien.
\b est une limite de mot de largeur nulle, pas un caractère. \bcat\b correspond à cat mais pas à concatenate. Dans une classe de caractères, [\b] signifie backspace à la place — un vrai piège.
Un motif qui doit correspondre à toute l'entrée a besoin des deux ancres. ^\d+ seul correspond volontiers au début de 123abc.
Aide-mémoire
Backtracking catastrophique
Des quantificateurs imbriqués où la partie interne et externe peuvent correspondre au même texte — (a+)+$, (\w+\s?)*$, (\d+)*x — donnent au moteur un nombre exponentiel de façons de découper l'entrée. Sur une chaîne qui échoue, chaque caractère supplémentaire double à peu près le travail, donc 30 caractères peuvent prendre des minutes.
La solution consiste à retirer l'ambiguïté : (a+)+ devient a+ ; (\w+\s?)* devient \w+(?:\s\w+)*. Là où votre moteur les prend en charge, un groupe atomique (?>…) ou un quantificateur possessif a++ interdit carrément le backtracking — PCRE et Python 3.11+ les ont tous les deux, JavaScript n'a ni l'un ni l'autre.
Ce testeur exécute la correspondance dans un Web Worker avec une limite de temps, donc un motif hors de contrôle est interrompu au lieu de geler l'onglet. Votre serveur en production n'a pas ce filet de sécurité.
Aide-mémoire
Filtres de mots et le problème de Scunthorpe
Une liste de mots sans limites correspond à l'intérieur de mots innocents. Le cas canonique est la ville anglaise de Scunthorpe, dont les habitants ont été bloqués pendant des années lors de l'inscription à des services à cause des quatre lettres au milieu de son nom.
Plus proche de nous : hell correspond dans shell, ass dans class et password, doc dans document. Entourer l'alternance de \b(?:…)\b corrige la plupart des cas. Cela ne corrigera pas le contournement volontaire (h e l l, h3ll), et pourchasser cela avec des regex produit plus de faux positifs que cela n'en évite — c'est pourquoi la modération réelle associe une regex petite et prudente à une revue humaine.
Aide-mémoire
Échappement, classes et le point
À l'intérieur de [ ], la plupart des métacaractères perdent leur pouvoir : [.+*] désigne trois caractères littéraux. Seuls ^ (en première position), - (entre deux caractères) et le backslash restent spéciaux, et ] doit être échappé.
Le point signifie « n'importe quel caractère sauf un saut de ligne » jusqu'à ce que vous ajoutiez s. Dans un motif d'IP ou de version, un point non échappé correspond à n'importe quoi — 1.2.3.4 correspond aussi à 1x2y3z4.
Quand vous construisez un motif à partir d'une saisie utilisateur, échappez-la d'abord. En JavaScript : s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). En PHP preg_quote(), en Python re.escape().
Aide-mémoire
Des groupes que vous voulez probablement non capturants
Chaque ( ) stocke sa correspondance et renumérote tout ce qui suit. Si vous n'avez besoin d'un groupement que pour une alternance ou un quantificateur, utilisez (?:…) — cela garde votre $1 stable quand vous ajoutez plus tard un groupe devant.
Les groupes nommés (?<user>…) survivent entièrement à une réorganisation, et se lisent bien mieux dans une chaîne de remplacement : $<user> plutôt que $3. Python les écrit (?P<user>…).
Vous gérez votre propre serveur de jeu ?
Serveurs de jeu Wespner avec protection DDoS, disques NVMe et activation en quelques minutes.