Tester wyrażeń regularnych (regex)
Wpisz wzorzec, zaznacz potrzebne flagi i wklej tekst: każde dopasowanie jest podświetlane na bieżąco i wyświetlane na liście wraz z pozycją i grupami przechwytującymi. Wzorzec działa na wbudowanym silniku wyrażeń regularnych JavaScript Twojej przeglądarki, więc wyniki są zgodne z Twoim kodem, a tekst pozostaje na Twoim urządzeniu.
Znaki: 0 · słowa: 0 · wiersze: 0
Dopasowania zostaną podświetlone tutaj.Znaki: 0 · słowa: 0 · wiersze: 0
Działa w całości w tej karcie przeglądarki. Twój tekst nie jest wysyłany ani zapisywany.
Elementy wyrażeń regularnych JavaScript
Kolumnę pierwszego dopasowania uzyskano, uruchamiając każdy wzorzec na jego tekście w silniku JavaScript, który zbudował tę stronę.
| Token | Znaczenie | Wzorzec | Tekst | Pierwsze dopasowanie |
|---|---|---|---|---|
\d | Cyfra 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | Litera, cyfra lub podkreślenie (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Biały znak, w tym tabulatory i podziały wierszy | /\s+/ | two spaces | |
. | Dowolny znak poza podziałem wiersza (chyba że s) | /a.c/ | abc a-c | abc |
^ $ | Początek i koniec danych (lub wiersza, z m) | /^\w+$/ | single | single |
[abc] | Jeden z wymienionych znaków | /[aeiou]/ | rhythm and blues | a |
[^abc] | Dowolny znak spoza listy | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 lub więcej, 1 lub więcej, 0 lub 1 | /colou?r/ | color colour | color |
{n,m} | Od n do m razy | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Grupa przechwytująca | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Nazwana grupa przechwytująca | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Grupa bez przechwytywania | /(?:ab)+/ | ababab! | ababab |
a|b | Jedna lub druga strona | /cat|dog/ | hotdog | dog |
\b | Granica słowa | /\bcat\b/ | concat cat | cat |
(?=…) | Z następującym (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Bez poprzedzającego (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Dowolna litera Unicode (wymaga u) | /\p{L}+/u | naïve 東京 | naïve |
Sześć flag i co zmieniają
g (global) znajduje wszystkie dopasowania zamiast zatrzymać się na pierwszym; bez niej lista zawiera jeden wpis. i ignoruje wielkość liter. m (multiline) sprawia, że ^ i $ dopasowują początek i koniec każdego wiersza, a nie tylko całego tekstu, co przydaje się we wzorcu na końcowe spacje. s (dotAll, dodana w ES2018) pozwala, by . dopasowywała też znaki końca wiersza. u (unicode) traktuje tekst jako punkty kodowe, więc emoji liczy się jako jeden znak, i włącza sekwencje właściwości, takie jak \p{L} dla dowolnej litery w dowolnym piśmie. y (sticky) dopasowuje tylko dokładnie w bieżącej pozycji, a ten tryb stosują tokenizery. JavaScript ma też flagę d (indeksy dopasowań) i v (operacje na zbiorach w klasach); ten tester obsługuje tylko sześć powyższych.
Pod tekstem testowym każde dopasowanie pokazuje swój indeks i grupy. Grupy numerowane powstają ze zwykłych nawiasów, (?:…) grupuje bez przechwytywania, a (?<year>\d{4}) tworzy grupę nazwaną, która pojawia się pod swoją nazwą, jak pokazuje przykład z datą ISO. Menu Common patterns wstawia sprawdzone punkty wyjścia dla adresów e-mail, adresów URL, adresów IPv4, kolorów szesnastkowych, UUID, powtórzonych słów i końcowych spacji. Wzorzec e-mail traktuj jako szybką kontrolę, a nie walidację: pełna gramatyka adresów jest znacznie bardziej liberalna, a jedynym prawdziwym testem jest wysłanie wiadomości.
Lookbehind i katastrofalne nawracanie (backtracking)
Asercje wyprzedzające i wsteczne sprawdzają, co otacza daną pozycję, bez zużywania znaków. Asercje wyprzedzające, (?=…) i (?!…), od zawsze są częścią JavaScriptu; asercje wsteczne, (?<=…) i (?<!…), pojawiły się w ES2018 i trafiły do wszystkich głównych przeglądarek, gdy w 2023 roku obsłużyła je Safari 16.4. Dlatego (?<=\$)\d+ znajduje 42 w „$42” bez znaku dolara. W odróżnieniu od wielu innych silników JavaScript dopuszcza asercje wsteczne o dowolnej długości.
Silnik JavaScriptu działa z nawrotami: gdy ścieżka zawiedzie, wraca i próbuje alternatyw. Zagnieżdżone kwantyfikatory, takie jak (a+)+$, dają mu wykładniczą liczbę sposobów podziału tego samego tekstu, więc ciąg 30 liter a zakończony literą x może zająć kilka sekund, a kilka liter więcej nawet godziny. To katastrofalny nawrót, a na serwerach staje się on atakiem ReDoS, czyli odmową usługi; pojedyncza reguła WAF z taką wadą wyłączyła sieć Cloudflare na około pół godziny 2 lipca 2019 roku. Ponieważ ten tester działa w Twojej karcie, taki wzorzec może zawiesić stronę; odśwież ją i przepisz wzorzec tak, aby żadne dwa kwantyfikatory nie mogły obejmować tych samych znaków, używając węższych klas, jak [^,]* zamiast .*, albo kotwic. Do edycji samego tekstu, a nie dopasowywania, zobacz narzędzia tekstowe; więcej narzędzi dla programistów znajdziesz w sekcji narzędzia dla programistów.
Najczęściej zadawane pytania
- Dlaczego moje wyrażenie regularne znajduje tylko jedno dopasowanie?
- Flaga g jest wyłączona. Bez niej silnik zatrzymuje się po pierwszym dopasowaniu. Zaznacz g, aby wyświetlić wszystkie wystąpienia; sama flaga y też znajduje kilka, ale tylko wtedy, gdy następują bezpośrednio po sobie.
- Czy \d w JavaScript dopasowuje cyfry z innych systemów pisma?
- Nie. W JavaScripcie \d oznacza tylko 0–9, a \w tylko litery ASCII, cyfry i podkreślenie, nawet z flagą u. Dla innych pism użyj \p{Nd} lub \p{L} z flagą u.
- Czy wzorzec przetestowany tutaj zadziała tak samo w Pythonie lub PHP?
- Podstawowa składnia jest wspólna, ale szczegóły się różnią: nazwane grupy w Pythonie zapisuje się jako
(?P<name>…), PHP i Python obsługują kwantyfikatory zaborcze, których JavaScript nie ma, a reguły asercji wstecznych bywają różne. Przetestuj wzorzec ponownie w docelowym silniku. - Jak dopasować dosłowną kropkę lub nawias?
- Poprzedź go ukośnikiem odwrotnym:
\.dopasowuje kropkę, a\[otwierający nawias kwadratowy. W klasie znaków większość symboli jest już dosłowna, więc[.]też dopasowuje tylko kropkę. - Dlaczego strona zawiesiła się podczas wpisywania wzorca?
- Wzorzec prawdopodobnie wywołał katastrofalny nawrót na Twoim tekście. Odśwież stronę, unikaj zagnieżdżonych kwantyfikatorów, takich jak
(.*)*lub(a+)+, i spraw, by każda część dopasowywała jak najmniej.