Tester regulárnych výrazov
Napíšte vzor, sledujte, ako sa počas písania zhoduje s vaším textom, a uvidíte presne, čo každý token robí. Zachytávajúce skupiny, náhľad nahradenia a kontrola prenositeľnosti do PCRE a Pythonu.
Vzor
Váš regulárny výraz
Píšte len telo vzoru — bez okolitých lomiek. Všetko sa aktualizuje počas písania.
Mení iba kontrolu prenositeľnosti — vyhodnotenie vždy beží na JavaScriptovom engine vášho prehliadača.
Predvoľby
Testovací text
Text, na ktorý sa vzor aplikuje
Vložte reálne dáta — riadok logu, konfiguráciu, export chatu. Nič neopúšťa váš prehliadač.
794 znakov · 14 riadkov
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
Zachytávajúce skupiny
Každá zhoda so svojimi skupinami a pozíciami
Číslované skupiny vznikajú obyčajnými ( ). Pomenované skupiny vznikajú z (?<name>…) a sú uvedené zvlášť.
Zadajte vzor a uvidíte zhody aj ich zachytávajúce skupiny.
Režim vysvetlenia
Čo presne robí každá časť vzoru
Čítajte zhora nadol — v tomto poradí vzor číta aj engine. Odsadenie ukazuje zanorenie v skupinách.
(?<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.Nahradenie
Náhľad nahradenia
Použite $1, $2 pre číslované skupiny, $<name> pre pomenované, $& pre celú zhodu a $$ pre doslovný znak dolára.
Výsledok
Zadajte vzor a uvidíte náhľad nahradenia.
Úprimná poznámka
Táto stránka nespúšťa PCRE ani Python
Je tu jediný regex engine: ten zabudovaný vo vašom prehliadači, ktorý implementuje dialekt JavaScriptu. Výber PCRE alebo Pythonu engine neprepne a ani nemôže — žiadne PCRE ani CPython v tejto karte nebeží.
Nastavenie dialektu namiesto toho kontroluje, či vzor neobsahuje konštrukcie, ktoré sa vo vybranom dialekte zapisujú inak, správajú sa inak, alebo v ňom vôbec neexistujú. Zhody vyššie berte ako výsledky JavaScriptu a zoznam vpravo ako „čo vás zahryzne, keď to vložíte do PHP alebo Pythonu“.
Zodpovedajúce volanie
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.
Kontrola prenositeľnosti
Prenositeľnosť do JavaScript
Heuristika — vzor sa prechádza ako text, takže konštrukcia zapísaná vnútri znakovej triedy môže byť nahlásená tiež.
Ťahák
Hladné vs. lenivé
Zďaleka najčastejší dôvod, prečo vzor „berie priveľa“.
<.*> proti <b>bold</b> sa zhoduje s celým reťazcom, nie len s <b>. * a + sú hladné: berú všetko, čo môžu, a znaky vracajú až vtedy, keď zvyšok vzoru zlyhá.
Pridaním ? urobíte kvantifikátor lenivým — <.*?> sa zastaví pri prvom >. Väčšinou je však lepšie povedať, čo naozaj myslíte: <[^>]*> cez oddeľovač vôbec neprejde a nemusí sa vracať.
Ťahák
Kotvy a hranice
^ a $ sú začiatok a koniec reťazca — kým nepridáte príznak m, keď sa z nich stane začiatok a koniec každého riadka. Zabudnuté m pri viacriadkovom konfiguračnom súbore je dôvod, prečo riadkový vzor ticho nenájde nič.
\b je hranica slova s nulovou šírkou, nie znak. \bcat\b sa zhoduje so slovom cat, ale nie so slovom concatenate. Vnútri znakovej triedy znamená [\b] backspace — skutočná pasca.
Vzor, ktorý sa musí zhodovať s celým vstupom, potrebuje obe kotvy. Samotné ^\d+ pokojne sadne na začiatok reťazca 123abc.
Ťahák
Katastrofický backtracking
Vnorené kvantifikátory, kde vnútorná aj vonkajšia časť môžu sadnúť na ten istý text — (a+)+$, (\w+\s?)*$, (\d+)*x — dávajú engine exponenciálne veľa spôsobov, ako vstup rozdeliť. Pri reťazci, ktorý neprejde, každý ďalší znak zhruba zdvojnásobí prácu, takže 30 znakov môže trvať minúty.
Riešením je odstrániť nejednoznačnosť: z (a+)+ sa stane a+; z (\w+\s?)* sa stane \w+(?:\s\w+)*. Kde to engine podporuje, atomická skupina (?>…) alebo posesívny kvantifikátor a++ backtracking zakáže úplne — PCRE a Python 3.11+ majú oboje, JavaScript ani jedno.
Tento tester vyhodnocuje vo Web Workeri s časovým limitom, takže divoký vzor sa preruší namiesto toho, aby zamrazil kartu. Váš produkčný server takúto poistku nemá.
Ťahák
Filtre slov a Scunthorpský problém
Zoznam slov bez hraníc sa zhoduje aj vnútri nevinných slov. Učebnicovým prípadom je anglické mesto Scunthorpe, ktorého obyvatelia sa roky nemohli zaregistrovať do služieb kvôli štyrom písmenám uprostred jeho názvu.
Bližšie k domovu: hell sadne na shell, ass na class aj password, doc na document. Obalenie alternácie do \b(?:…)\b väčšinu z toho vyrieši. Nevyrieši to zámerné obchádzanie (h e l l, h3ll) a naháňanie sa za ním pomocou regexu vyrobí viac falošných poplachov, než koľko ich zachytí — preto skutočná moderácia kombinuje malý konzervatívny regex s ľudskou kontrolou.
Ťahák
Escapovanie, triedy a bodka
Vnútri [ ] väčšina metaznakov stráca svoju moc: [.+*] sú tri obyčajné znaky. Špeciálne zostáva len ^ (na prvej pozícii), - (medzi znakmi) a spätná lomka, a ] sa musí escapovať.
Bodka znamená „ľubovoľný znak okrem konca riadka“, kým nepridáte s. V IP adrese alebo verzii sa neescapovaná bodka zhoduje s čímkoľvek — 1.2.3.4 sadne aj na 1x2y3z4.
Keď vzor skladáte z používateľského vstupu, najprv ho escapujte. V JavaScripte: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). V PHP preg_quote(), v Pythone re.escape().
Ťahák
Skupiny, ktoré pravdepodobne chcete mať nezachytávajúce
Každá ( ) svoju zhodu uloží a prečísluje všetko za sebou. Ak potrebujete len zoskupiť alternáciu alebo kvantifikátor, použite (?:…) — vaše $1 tak zostane stabilné, aj keď pred neho neskôr pridáte ďalšiu skupinu.
Pomenované skupiny (?<user>…) prečkajú preusporiadanie bez zmeny a v náhradnom reťazci sa čítajú oveľa lepšie: $<user> namiesto $3. Python ich zapisuje ako (?P<user>…).
Prevádzkuješ vlastný herný server?
Herné servery Wespner s DDoS ochranou, NVMe diskami a aktiváciou do pár minút.