Tester wyrażeń regularnych
Napisz wzorzec, obserwuj jego dopasowanie do tekstu w miarę pisania i zobacz dokładnie, co robi każdy token. Grupy przechwytujące, podgląd zamiany i sprawdzanie przenośności dla PCRE i Pythona.
Wzorzec
Twoje wyrażenie regularne
Wpisz tylko treść wzorca — bez otaczających ukośników. Wszystko aktualizuje się w miarę pisania.
Zmienia tylko sprawdzenie przenośności — dopasowywanie zawsze działa na silniku JavaScript twojej przeglądarki.
Gotowe zestawy
Tekst testowy
Tekst do dopasowania
Wklej prawdziwe dane — linię logu, konfigurację, eksport czatu. Nic nie opuszcza twojej przeglądarki.
794 znaków · 14 linii
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
Grupy przechwytujące
Każde dopasowanie, z jego grupami i pozycjami
Grupy numerowane pochodzą ze zwykłych ( ). Grupy nazwane pochodzą z (?<name>…) i są wymienione osobno.
Wpisz wzorzec, aby zobaczyć dopasowania i ich grupy przechwytujące.
Tryb wyjaśniania
Co faktycznie robi każdy fragment wzorca
Czytaj od góry do dołu — to kolejność, w jakiej czyta go silnik. Wcięcie pokazuje zagnieżdżenie wewnątrz grup.
(?<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.Zamiana
Podgląd znajdź i zamień
Użyj $1, $2 dla grup numerowanych, $<name> dla nazwanych, $& dla całego dopasowania i $$ dla dosłownego znaku dolara.
Wynik
Wpisz wzorzec, aby zobaczyć podgląd zamiany.
Uwaga o rzetelności
Ta strona nie uruchamia PCRE ani Pythona
Jest tu tylko jeden silnik regex: ten wbudowany w twoją przeglądarkę, implementujący odmianę JavaScript. Wybranie PCRE lub Pythona nie przełącza silników i nie może — żaden PCRE ani CPython nie działa w tej karcie.
To, co robi zamiast tego ustawienie odmiany, to sprawdzanie twojego wzorca pod kątem konstrukcji, które są zapisywane inaczej, zachowują się inaczej albo po prostu nie istnieją w wybranej odmianie. Traktuj powyższe dopasowania jako wyniki JavaScript, a listę po prawej jako „co ugryzie cię, gdy wkleisz to do PHP lub Pythona”.
Odpowiednik wywołania
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.
Sprawdzenie przenośności
Przenośność do JavaScript
Heurystyka — wzorzec jest skanowany jako tekst, więc konstrukcja zapisana wewnątrz klasy znaków może nadal zostać zgłoszona.
Ściągawka
Zachłanny kontra leniwy
Najczęstszy pojedynczy powód, dla którego wzorzec „dopasowuje za dużo”.
<.*> wobec <b>bold</b> dopasowuje cały ciąg, nie <b>. * i + są zachłanne: chwytają wszystko, co mogą, i oddają znaki tylko wtedy, gdy reszta wzorca zawodzi.
Dodaj ?, aby kwantyfikator był leniwy — <.*?> zatrzymuje się na pierwszym >. Zwykle lepiej: powiedz dokładnie, co masz na myśli, <[^>]*>, co w ogóle nie może przekroczyć separatora i nie backtrackuje.
Ściągawka
Kotwice i granice
^ i $ to początek i koniec ciągu — dopóki nie dodasz flagi m, po czym stają się początkiem i końcem każdej linii. Zapomnienie o m w wieloliniowym pliku konfiguracyjnym to powód, dla którego wzorzec działający na liniach po cichu nic nie dopasowuje.
\b to bezszerokościowa granica słowa, nie znak. \bcat\b pasuje do cat, ale nie do concatenate. Wewnątrz klasy znaków [\b] oznacza backspace — prawdziwa pułapka.
Wzorzec, który musi dopasować cały tekst wejściowy, potrzebuje obu kotwic. Samo ^\d+ chętnie dopasowuje początek 123abc.
Ściągawka
Katastrofalny backtracking
Zagnieżdżone kwantyfikatory, w których wewnętrzna i zewnętrzna część mogą dopasować ten sam tekst — (a+)+$, (\w+\s?)*$, (\d+)*x — dają silnikowi wykładniczo wiele sposobów podziału tekstu wejściowego. Na nieudanym ciągu każdy dodatkowy znak w przybliżeniu podwaja pracę, więc 30 znaków może zająć minuty.
Poprawka polega na usunięciu niejednoznaczności: (a+)+ staje się a+; (\w+\s?)* staje się \w+(?:\s\w+)*. Tam, gdzie twój silnik je obsługuje, grupa atomowa (?>…) lub kwantyfikator posesywny a++ całkowicie zabrania backtrackingu — PCRE i Python 3.11+ mają oba, JavaScript nie ma żadnego.
Ten tester uruchamia dopasowywanie w Web Workerze z limitem czasu, więc rozpędzony wzorzec przerywa działanie zamiast zamrażać kartę. Twój serwer produkcyjny nie ma takiej siatki bezpieczeństwa.
Ściągawka
Filtry słów i problem Scunthorpe
Lista słów bez granic dopasowuje wewnątrz niewinnych słów. Klasyczny przypadek to angielskie miasto Scunthorpe, którego mieszkańcy przez lata byli blokowani przy rejestracji do usług z powodu czterech liter w środku jego nazwy.
Bliżej domu: hell pasuje do shell, ass pasuje do class i password, doc pasuje do document. Owinięcie alternatywy w \b(?:…)\b naprawia większość tego. Nie naprawi celowego obchodzenia (h e l l, h3ll), a gonienie za tym za pomocą regex produkuje więcej fałszywych trafień, niż zapobiega — dlatego prawdziwa moderacja łączy mały, konserwatywny regex z ludzką weryfikacją.
Ściągawka
Escapowanie, klasy znaków i kropka
Wewnątrz [ ] większość metaznaków traci swoją moc: [.+*] to trzy zwykłe znaki. Tylko ^ (pierwsza pozycja), - (między znakami) i backslash pozostają specjalne, a ] musi być poprzedzony ukośnikiem.
Kropka oznacza „dowolny znak oprócz znaku nowej linii”, dopóki nie dodasz s. We wzorcu IP lub wersji nieoskryptowana kropka pasuje do wszystkiego — 1.2.3.4 pasuje też do 1x2y3z4.
Gdy budujesz wzorzec z danych wejściowych użytkownika, najpierw je zescapuj. W JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). W PHP preg_quote(), w Pythonie re.escape().
Ściągawka
Grupy, które prawdopodobnie chcesz mieć nieprzechwytujące
Każdy ( ) zapisuje swoje dopasowanie i renumeruje wszystko po nim. Jeśli potrzebujesz grupowania tylko do alternatywy lub kwantyfikatora, użyj (?:…) — utrzymuje to stabilność twojego $1, gdy później dodasz grupę przed nim.
Grupy nazwane (?<user>…) całkowicie przetrwają zmianę kolejności i czytają się dużo lepiej w ciągu zamiany: $<user> zamiast $3. Python zapisuje je jako (?P<user>…).
Prowadzisz własny serwer gier?
Serwery gier Wespner z ochroną DDoS, dyskami NVMe i aktywacją w kilka minut.