Regex Tester
Schrijf een patroon, zie het je tekst matchen terwijl je typt, en zie precies wat elk token doet. Capture groups, een replace-voorbeeld, en een portabiliteitscheck voor PCRE en Python.
Patroon
Jouw reguliere expressie
Schrijf alleen de patroon-body — geen omringende slashes. Alles wordt bijgewerkt terwijl je typt.
Verandert alleen de portabiliteitscheck — matching draait altijd op de JavaScript-engine van je browser.
Presets
Testtekst
Tekst om tegen te matchen
Plak echte data — een logregel, een config, een chatexport. Er verlaat niets je browser.
794 tekens · 14 regels
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
Capture groups
Elke match, met zijn groepen en posities
Genummerde groepen komen van gewone ( ). Named groups komen van (?<naam>…) en worden apart weergegeven.
Voer een patroon in om matches en hun capture groups te zien.
Uitlegmodus
Wat elk onderdeel van het patroon daadwerkelijk doet
Lees van boven naar beneden — zo leest de engine het ook. Inspringing toont nesting binnen groepen.
(?<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.Vervangen
Voorbeeld van zoeken-en-vervangen
Gebruik $1, $2 voor genummerde groepen, $<naam> voor named groups, $& voor de hele match en $$ voor een letterlijk dollarteken.
Resultaat
Voer een patroon in om een vervanging te bekijken.
Eerlijkheidsnotitie
Deze pagina draait geen PCRE of Python
Er is hier maar één regex-engine: die in je browser, die de JavaScript-variant implementeert. PCRE of Python selecteren schakelt geen engine om en kan dat ook niet — er draait geen PCRE of CPython in dit tabblad.
Wat de variant-instelling wél doet, is je patroon controleren op constructies die anders geschreven worden, anders gedragen of simpelweg niet bestaan in de variant die je koos. Behandel de matches hierboven als JavaScript-resultaten, en de lijst rechts als "wat je bijt zodra je dit in PHP of Python plakt".
Equivalente aanroep
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.
Portabiliteitscheck
Portabiliteit naar JavaScript
Heuristisch — het patroon wordt als tekst gescand, dus een constructie geschreven binnen een tekenklasse kan alsnog worden gemeld.
Spiekbriefje
Greedy vs. lazy
De meest voorkomende reden waarom een patroon "te veel matcht".
<.*> tegen <b>bold</b> matcht de hele string, niet <b>. * en + zijn greedy: ze pakken alles wat ze kunnen en geven tekens alleen terug als de rest van het patroon faalt.
Voeg ? toe om een kwantor lazy te maken — <.*?> stopt bij de eerste >. Meestal nog beter: zeg wat je daadwerkelijk bedoelt, <[^>]*>, dat de scheiding helemaal niet kan overschrijden en niet backtrackt.
Spiekbriefje
Ankers en grenzen
^ en $ zijn het begin en einde van de string — totdat je de vlag m toevoegt, waarna ze het begin en einde van elke regel worden. De vlag m vergeten bij een config-bestand met meerdere regels is waarom een patroon per regel plotseling niets meer matcht.
\b is een zero-width woordgrens, geen teken. \bcat\b matcht cat maar niet concatenate. Binnen een tekenklasse [\b] betekent backspace in plaats daarvan — een echte valkuil.
Een patroon dat de hele invoer moet matchen heeft beide ankers nodig. ^\d+ alleen matcht gewoon het begin van 123abc.
Spiekbriefje
Catastrofaal backtracken
Geneste kwantoren waarbij het binnenste en buitenste deel dezelfde tekst kunnen matchen — (a+)+$, (\w+\s?)*$, (\d+)*x — geven de engine exponentieel veel manieren om de invoer te splitsen. Bij een falende string verdubbelt elk extra teken ongeveer het werk, zodat 30 tekens minuten kan duren.
De oplossing is de ambiguïteit weg te nemen: (a+)+ wordt a+; (\w+\s?)* wordt \w+(?:\s\w+)*. Waar je engine het ondersteunt, verbiedt een atomic group (?>…) of een possessive kwantor a++ het backtracken volledig — PCRE en Python 3.11+ hebben beide, JavaScript geen van beide.
Deze tester voert matching uit in een Web Worker met een tijdslimiet, zodat een doorlopend patroon afbreekt in plaats van het tabblad te bevriezen. Je productieserver heeft dat vangnet niet.
Spiekbriefje
Woordfilters en het Scunthorpe-probleem
Een woordenlijst zonder grenzen matcht ook binnen onschuldige woorden. Het bekendste voorbeeld is het Engelse stadje Scunthorpe, waarvan inwoners jarenlang werden geblokkeerd bij het aanmelden voor diensten vanwege de vier letters in het midden van de naam.
Dichter bij huis: hell matcht shell, ass matcht class en password, doc matcht document. De alternatie omwikkelen met \b(?:…)\b lost het meeste op. Het lost geen opzettelijke ontwijking op (h e l l, h3ll), en dat met regex achterna gaan levert meer valse positieven op dan het voorkomt — daarom combineert echte moderatie een kleine, conservatieve regex met menselijke controle.
Spiekbriefje
Escapen, klassen en de punt
Binnen [ ] verliezen de meeste metatekens hun kracht: [.+*] is drie letterlijke tekens. Alleen ^ (eerste positie), - (tussen tekens) en de backslash blijven speciaal, en ] moet worden geëscaped.
De punt betekent "elk teken behalve een regeleinde" totdat je de vlag s toevoegt. In een IP- of versiepatroon matcht een niet-geëscapete punt alles — 1.2.3.4 matcht ook 1x2y3z4.
Wanneer je een patroon opbouwt uit gebruikersinvoer, escape het dan eerst. In JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). In PHP preg_quote(), in Python re.escape().
Spiekbriefje
Groepen die je waarschijnlijk non-capturing wilt maken
Elke ( ) slaat zijn match op en hernummert alles erna. Als je groepering alleen nodig hebt voor een alternatief of een kwantor, gebruik dan (?:…) — dat houdt je $1 stabiel wanneer je later een groep ervoor toevoegt.
Named groups (?<user>…) overleven herordening volledig, en lezen veel beter in een vervangingsstring: $<user> in plaats van $3. Python spelt ze als (?P<user>…).
Beheer je een eigen gameserver?
Wespner-gameservers met DDoS-bescherming, NVMe-schijven en activering binnen enkele minuten.