Regex tesztelő
Írj egy mintát, nézd, ahogy gépelés közben illeszkedik a szövegedre, és lásd, mit csinál pontosan minden token. Capture groupok, csere-előnézet és hordozhatósági ellenőrzés PCRE-hez és Pythonhoz.
Minta
A reguláris kifejezésed
Csak a minta törzsét írd, körülvevő perjelek nélkül. Minden frissül, ahogy gépelsz.
Csak a hordozhatósági ellenőrzést változtatja — az illesztés mindig a böngésződ JavaScript motorján fut.
Sablonok
Teszt szöveg
Szöveg, amin illeszteni fogunk
Illessz be valódi adatot — egy log sort, egy configot, egy chatexportot. Semmi nem hagyja el a böngésződet.
794 karakter · 14 sor
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 groupok
Minden találat, a csoportjaival és pozícióival
A számozott csoportok sima ( )-ből származnak. A nevesített csoportok (?<name>…)-ból, és külön vannak felsorolva.
Adj meg egy mintát a találatok és a capture groupjaik megtekintéséhez.
Magyarázat mód
Mit csinál valójában a minta minden egyes darabja
Olvasd felülről lefelé — a motor is ebben a sorrendben olvassa. A behúzás a csoportokon belüli beágyazást mutatja.
(?<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.Csere
Keresés-és-csere előnézete
Használj $1, $2-t a számozott csoportokhoz, $<name>-et a nevesítettekhez, $&-t a teljes találathoz és $$-t egy literál dollárjelhez.
Eredmény
Adj meg egy mintát egy csere előnézetéhez.
Őszinte megjegyzés
Ez az oldal nem futtat PCRE-t vagy Pythont
Itt csak egyetlen regex motor van: a böngésződbe épített, ami a JavaScript nyelvjárását valósítja meg. A PCRE vagy Python kiválasztása nem vált motort, és nem is válthat — sem PCRE, sem CPython nem fut ebben a lapban.
Amit a nyelvjárás-beállítás valójában csinál: ellenőrzi a mintádat olyan konstrukciókra, amiket másképp írnak, másképp viselkednek, vagy egyszerűen nem léteznek a kiválasztott nyelvjárásban. Kezeld a fenti találatokat JavaScript eredményként, a jobb oldali listát pedig úgy, mint „ami megharap, ha ezt PHP-be vagy Pythonba illeszted”.
Egyenértékű hívás
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.
Hordozhatósági ellenőrzés
Hordozhatóság ide: JavaScript
Heurisztikus — a minta szövegként van átvizsgálva, így egy karakterosztályon belül írt konstrukció is jelentésre kerülhet.
Puska
Mohó vs. lusta
A leggyakoribb oka annak, hogy egy minta „túl sokra illeszkedik”.
A <.*> a <b>bold</b>-on a teljes stringre illeszkedik, nem a <b>-re. A * és a + mohók: mindent megragadnak, amit tudnak, és csak akkor adnak vissza karaktereket, ha a minta többi része elbukik.
Adj hozzá egy ?-t, hogy egy kvantor lusta legyen — a <.*?> megáll az első >-nál. Általában még jobb: mondd ki, amit valójában gondolsz, <[^>]*>, ami egyáltalán nem léphet át a határolón, és nem is backtrackel.
Puska
Horgonyok és határok
A ^ és a $ a string eleje és vége — amíg hozzá nem adod az m flaget, ekkor minden sor elejévé és végévé válnak. Az m elfelejtése egy többsoros configfájlon az oka, hogy egy soronkénti minta csendben semmit nem talál.
A \b egy nulla szélességű szóhatár, nem karakter. A \bcat\b illeszkedik a cat-re, de a concatenate-re nem. Egy karakterosztályon belül a [\b] backspace-t jelent — valódi csapda.
Egy mintának, aminek a teljes bemenetre kell illeszkednie, mindkét horgonyra szüksége van. A ^\d+ önmagában boldogan illeszkedik a 123abc elejére.
Puska
Katasztrofális backtracking
Az egymásba ágyazott kvantorok, ahol a belső és a külső rész ugyanarra a szövegre illeszkedhet — (a+)+$, (\w+\s?)*$, (\d+)*x —, exponenciálisan sok módot adnak a motornak a bemenet felosztására. Egy sikertelen stringen minden extra karakter nagyjából megduplázza a munkát, így 30 karakter is percekig tarthat.
A megoldás a kétértelműség eltávolítása: az (a+)+ legyen a+; a (\w+\s?)* legyen \w+(?:\s\w+)*. Ahol a motorod támogatja, egy atomi csoport (?>…) vagy egy birtokos kvantor a++ teljesen megtiltja a backtrackinget — a PCRE és a Python 3.11+ is tudja, a JavaScript egyiket sem.
Ez a tesztelő egy Web Workerben futtatja az illesztést, időkorláttal, így egy elszabadult minta megszakad ahelyett, hogy lefagyasztaná a lapot. Az éles szerverednek nincs ilyen védőhálója.
Puska
Szószűrők és a Scunthorpe-probléma
Egy határok nélküli szólista ártatlan szavakon belül is illeszkedik. A klasszikus eset az angliai Scunthorpe városa, amelynek lakói évekig ki voltak zárva szolgáltatásokból a regisztrációnál a névben középen szereplő négy betű miatt.
Közelebbről: a hell illeszkedik a shell-re, az ass a class-ra és a password-re, a doc a document-re. Az alternáció \b(?:…)\b-be csomagolása a legtöbbet megoldja. A szándékos kijátszást (h e l l, h3ll) nem oldja meg, és ennek regexszel való üldözése több hamis pozitívot okoz, mint amennyit megelőz — ezért a valódi moderáció egy kicsi, konzervatív regexet emberi felülvizsgálattal párosít.
Puska
Escapelés, osztályok és a pont
A [ ] belsejében a legtöbb metakarakter elveszti az erejét: a [.+*] három literál karakter. Csak a ^ (első pozícióban), a - (karakterek között) és a backslash marad speciális, a ]-t pedig escape-elni kell.
A pont bármilyen karaktert jelent a sortörés kivételével, amíg hozzá nem adod az s-t. Egy IP- vagy verziómintában egy escape nélküli pont bármire illeszkedik — az 1.2.3.4 illeszkedik az 1x2y3z4-re is.
Ha felhasználói bemenetből építesz mintát, előbb escape-eld. JavaScriptben: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). PHP-ben preg_quote(), Pythonban re.escape().
Puska
Csoportok, amiket valószínűleg nem-rögzítőnek szeretnél
Minden ( ) tárolja a saját találatát, és újraszámozza mindazt, ami utána jön. Ha csak csoportosításra van szükséged egy alternációhoz vagy egy kvantorhoz, használj (?:…)-t — így a $1 stabil marad, ha később egy csoportot adsz hozzá elé.
A nevesített csoportok (?<user>…) teljesen túlélik az átrendezést, és sokkal jobban olvashatók egy csere stringben: $<user> a $3 helyett. Pythonban (?P<user>…) alakban írod.
Saját játékszervert üzemeltetsz?
Wespner játékszerverek DDoS-védelemmel, NVMe lemezekkel és néhány perc alatti aktiválással.