Testuj wyrażenie regularne

testuje wyrażenie regularne (regex) na tekście i wyświetla dopasowania oraz przechwycone grupy

Do czego służy tester wyrażeń regularnych?

Regex tester pozwala zweryfikować, że wzorzec wyrażenia regularnego (regex) dobrze odpowiada oczekiwanemu tekstowi, bez konieczności uruchamiania kodu aplikacyjnego. Wkleja się wzorzec, wkleja tekst wejściowy, zaznacza opcje (flagi), a narzędzie natychmiast wyświetla listę znalezionych dopasowań oraz przechwycone grupy. To webowy odpowiednik preg_match_all() w PHP, String.matchAll() w JavaScript lub re.findall() w Pythonie.

Regexy są jednocześnie potężne i podstępne. Przecinek, źle umieszczony nawias, zachłanny kwantyfikator, który zasysa zbyt wiele znaków: i wyekstrahowany ciąg nie jest już tym, którego się oczekiwało. Tester unika podróży tam i z powrotem z edytorem, terminalem i plikiem testowym: iterujemy wzorzec aż do zobaczenia właściwego wyniku.

Jak pisać wzorzec?

Wprowadź regex bez ograniczników. Bez /.../, bez #...#. Na przykład, aby przechwycić adresy email z tekstu, wpisz tylko [\w.+-]+@[\w-]+\.[\w.-]+. Opcje (flagi) są kontrolowane przez pola wyboru.

Opcja u (Unicode) jest domyślnie zaznaczona. Jest niemal zawsze pożądana: bez niej \w nie rozpoznaje akcentów, a niektóre wzorce zwracają cichy błąd PCRE na ciągach UTF-8.

Opcje PCRE

  • i (case-insensitive): [a-z] rozpoznaje też wielkie litery.
  • m (multiline): ^ i $ pasują do początków i końców każdej linii, a nie tylko początku i końca całego ciągu.
  • s (dotall): . rozpoznaje też znaki nowej linii. Przydatne dla wzorców, które muszą przechodzić przez akapity.
  • u (unicode): interpretuje wzorzec i podmiot w UTF-8. Niezbędne, gdy tekst zawiera znaki nie-ASCII (akcenty, emoji, ideogramy).

Przykłady częstych regex

  • Adres email: [\w.+-]+@[\w-]+\.[\w.-]+ (forma uproszczona, wystarczająca dla większości praktycznych przypadków, ścisły RFC 5322 jest bardzo złożony).
  • URL HTTP/HTTPS: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francuski numer telefonu: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francuski kod pocztowy: \b\d{5}\b
  • Data ISO (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • Adres IPv4: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Całe słowo: \bfoo\b (word boundaries unikają dopasowania football).
  • Hashtag: #\w+
  • Numer wersji semantycznej: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Identyfikator Twitter / X: @\w{1,15}

Przechwytywane grupy

Regex może zawierać grupy w nawiasach, które izolują część dopasowania do ponownego użycia. Na przykład wzorzec (\w+)@(\w+\.\w+) zastosowany do alice@example.com przechwytuje dwie grupy: alice i example.com. Narzędzie wyświetla te grupy w dedykowanej kolumnie, obok każdego dopasowania. Grupy nazwane ((?P<name>...)) są również wymienione, indeksowane swoją nazwą.

Aby grupować bez przechwytywania (przydatne do stosowania kwantyfikatora bez zanieczyszczania listy grup), używa się (?:...).

Ochrona przed ReDoS

Silnik PCRE PHP może wpaść w catastrophic backtracking na niektórych patologicznych wzorcach: wzorzec taki jak (a+)+$ zastosowany do długiego niezakończonego ciągu a może zablokować serwer na kilka sekund. Aby uniknąć tego odmowy usługi przez wyrażenie regularne (ReDoS), narzędzie stosuje dwa limity:

  • set_time_limit(2) po stronie workera (przetwarzanie poddaje się po 2 sekundach);
  • redukcja pcre.backtrack_limit do 100 000, co szybko powoduje porażkę wzorców, które eksplorują zbyt wiele kombinacji.

W przypadku zbyt kosztownego wzorca narzędzie wyświetla komunikat błędu PCRE (preg_last_error_msg()), zazwyczaj Backtrack limit was exhausted. Przeformułuj swój wzorzec, używając kwantyfikatorów posesywnych (a++) lub grup atomowych ((?>...)), aby uniknąć backtrackingu.

Najczęściej zadawane pytania

Dlaczego mój regex nie pasuje, choć działa w JavaScript?

Silnik tego narzędzia to PCRE (PHP), blisko Perla. Składnia jest bardzo podobna do JavaScript, ale kilka funkcji się różni: lookbehindy o zmiennej długości, niektóre aliasy Unicode lub domyślne zarządzanie wrażliwością na wielkość liter. Jeśli planujesz wykonać wzorzec po stronie przeglądarki, przetestuj też w środowisku JS.

Dlaczego moje \w nie przechwytuje akcentów?

Bez flagi u \w rozpoznaje tylko [A-Za-z0-9_]. Z u (Unicode) rozpoznaje wszystkie litery w sensie UCD, w tym znaki akcentowane. Aby pójść dalej, użyj klas Unicode: \p{L} (litera), \p{N} (cyfra), \p{P} (interpunkcja).

Czy narzędzie przechowuje mój tekst?

Nie. Wzorzec i podmiot są przetwarzane w RAM przez worker PHP, bez utrwalania. Żadne przesłane dane nie są logowane.

Co zrobić, jeśli otrzymam komunikat „Backtrack limit was exhausted"?

Twój wzorzec wykonuje za dużo cofnięć. Szukaj zagnieżdżonych kwantyfikatorów typu (a+)+ lub (\w+)*, które są typowymi przypadkami ReDoS. Zastąp je jednoznaczną formą: na przykład \w+ zamiast (\w+)*.

Czy mogę przetestować wzorzec wielolinijkowy?

Tak. Zaznacz opcję m, aby ^ i $ rozpoznawały początki i końce każdej linii. Zaznacz dodatkowo s, jeśli chcesz, aby . przechodziło przez znaki nowej linii.

Przykładowe zapytanie

curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
  -H "Content-Type: application/json" \
  -d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'

Schemat wejściowy

Pole Typ Wymagane Domyślnie
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Punkty końcowe

  • GET https://cdrn.fr/api/v1/tools - lista wszystkich dostępnych narzędzi
  • GET https://cdrn.fr/api/v1/tools/regex-tester - zwraca schemat dla tego narzędzia
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - uruchamia to narzędzie z payloadem JSON