Tester regulárních výrazů
Napište vzor, sledujte, jak se za běhu shoduje s vaším textem, a uvidíte přesně, co každý token dělá. Zachytávající skupiny, náhled nahrazení a kontrola přenositelnosti do PCRE a Pythonu.
Vzor
Váš regulární výraz
Pište jen tělo vzoru — bez okolních lomítek. Vše se aktualizuje během psaní.
Mění pouze kontrolu přenositelnosti — vyhodnocení vždy běží na JavaScriptovém enginu vašeho prohlížeče.
Předvolby
Testovací text
Text, na který se vzor aplikuje
Vložte reálná data — řádek logu, konfiguraci, export chatu. Nic neopouští váš prohlížeč.
794 znaků · 14 řádků
Wespner ops log — node eu-fra-03 Ticket #4821 opened by staff@wespner.eu, escalated to ops@mc.wespner.eu. Billing contact: billing@wespner.eu (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ící skupiny
Každá shoda se svými skupinami a pozicemi
Číslované skupiny vznikají obyčejnými ( ). Pojmenované skupiny vznikají z (?<name>…) a jsou uvedeny zvlášť.
Zadejte vzor a uvidíte shody i jejich zachytávající skupiny.
Režim vysvětlení
Co přesně dělá každá část vzoru
Čtěte shora dolů — v tomto pořadí vzor čte i engine. Odsazení ukazuje zanoření ve 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.Nahrazení
Náhled nahrazení
Použijte $1, $2 pro číslované skupiny, $<name> pro pojmenované, $& pro celou shodu a $$ pro doslovný znak dolaru.
Výsledek
Zadejte vzor a uvidíte náhled nahrazení.
Upřímná poznámka
Tato stránka nespouští PCRE ani Python
Je tu jediný regex engine: ten vestavěný ve vašem prohlížeči, který implementuje dialekt JavaScriptu. Výběr PCRE nebo Pythonu engine nepřepne a ani nemůže — žádné PCRE ani CPython v této záložce neběží.
Nastavení dialektu místo toho kontroluje, jestli vzor neobsahuje konstrukce, které se ve vybraném dialektu zapisují jinak, chovají se jinak, nebo v něm vůbec neexistují. Shody výše berte jako výsledky JavaScriptu a seznam vpravo jako „co vás kousne, až to vložíte do PHP nebo Pythonu“.
Odpovídající volání
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 přenositelnosti
Přenositelnost do JavaScript
Heuristika — vzor se prochází jako text, takže konstrukce zapsaná uvnitř znakové třídy může být nahlášena také.
Tahák
Hladové vs. líné
Zdaleka nejčastější důvod, proč vzor „bere příliš mnoho“.
<.*> proti <b>bold</b> odpovídá celému řetězci, ne jen <b>. * a + jsou hladové: berou vše, co mohou, a znaky vracejí až ve chvíli, kdy zbytek vzoru selže.
Přidáním ? uděláte kvantifikátor líný — <.*?> se zastaví u prvního >. Většinou je ale lepší říct, co skutečně myslíte: <[^>]*> přes oddělovač vůbec nepřejde a nemusí se vracet.
Tahák
Kotvy a hranice
^ a $ jsou začátek a konec řetězce — dokud nepřidáte příznak m, kdy se z nich stane začátek a konec každého řádku. Zapomenuté m u víceřádkového konfiguračního souboru je důvod, proč řádkový vzor tiše nenajde nic.
\b je hranice slova o nulové šířce, ne znak. \bcat\b odpovídá slovu cat, ale ne slovu concatenate. Uvnitř znakové třídy znamená [\b] backspace — skutečná past.
Vzor, který musí odpovídat celému vstupu, potřebuje obě kotvy. Samotné ^\d+ klidně odpovídá začátku řetězce 123abc.
Tahák
Katastrofický backtracking
Vnořené kvantifikátory, kde vnitřní i vnější část mohou odpovídat témuž textu — (a+)+$, (\w+\s?)*$, (\d+)*x — dávají enginu exponenciálně mnoho způsobů, jak vstup rozdělit. U řetězce, který neprojde, každý další znak zhruba zdvojnásobí práci, takže 30 znaků může trvat minuty.
Řešením je odstranit nejednoznačnost: z (a+)+ se stane a+; z (\w+\s?)* se stane \w+(?:\s\w+)*. Kde to engine podporuje, atomická skupina (?>…) nebo posesivní kvantifikátor a++ backtracking zakáže úplně — PCRE a Python 3.11+ mají obojí, JavaScript ani jedno.
Tento tester vyhodnocuje ve Web Workeru s časovým limitem, takže divoký vzor se přeruší místo toho, aby zamrazil záložku. Váš produkční server takovou pojistku nemá.
Tahák
Filtry slov a Scunthorpský problém
Seznam slov bez hranic odpovídá i uvnitř nevinných slov. Učebnicovým případem je anglické město Scunthorpe, jehož obyvatelé se roky nemohli registrovat do služeb kvůli čtyřem písmenům uprostřed jeho názvu.
Blíž domovu: hell sedí na shell, ass na class i password, doc na document. Obalení alternace do \b(?:…)\b většinu z toho vyřeší. Nevyřeší to záměrné obcházení (h e l l, h3ll) a honba za ním pomocí regexu vyrobí víc falešných poplachů, než kolik jich zachytí — proto skutečná moderace kombinuje malý konzervativní regex s lidskou kontrolou.
Tahák
Escapování, třídy a tečka
Uvnitř [ ] většina metaznaků ztrácí svou moc: [.+*] jsou tři obyčejné znaky. Speciální zůstává jen ^ (na první pozici), - (mezi znaky) a zpětné lomítko, a ] se musí escapovat.
Tečka znamená „libovolný znak kromě konce řádku“, dokud nepřidáte s. V IP adrese nebo verzi odpovídá neescapovaná tečka čemukoli — 1.2.3.4 sedí i na 1x2y3z4.
Když vzor skládáte z uživatelského vstupu, nejdřív ho escapujte. V JavaScriptu: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). V PHP preg_quote(), v Pythonu re.escape().
Tahák
Skupiny, které nejspíš chcete mít nezachytávající
Každá ( ) svou shodu uloží a přečísluje všechno za sebou. Pokud potřebujete jen seskupit alternaci nebo kvantifikátor, použijte (?:…) — vaše $1 pak zůstane stabilní, i když před něj později přidáte další skupinu.
Pojmenované skupiny (?<user>…) přečkají přeuspořádání beze změny a v náhradním řetězci se čtou mnohem lépe: $<user> místo $3. Python je zapisuje jako (?P<user>…).
Provozuješ vlastní herní server?
Herní servery Wespner s DDoS ochranou, NVMe disky a aktivací do pár minut.