Wyrażenie regularne (regex) to zwięzły sposób opisania wzorca tekstu — nie konkretnego ciągu znaków, lecz reguły, którą ciąg musi spełniać. Zamiast przechodzić po znakach w pętli, jednym wyrażeniem można sprawdzić lub znaleźć złożoną strukturę.
Podstawowe elementy
- Klasy znaków —
\d(cyfra),\w(litera/cyfra/podkreślenie),\s(biały znak), lub własna klasa jak[a-zA-Z]. - Kwantyfikatory —
*(0 lub więcej),+(1 lub więcej),?(0 lub 1),{2,5}(od 2 do 5 razy). - Grupy przechwytujące — nawiasy
(...)wyodrębniają fragment dopasowania, który można potem wykorzystać osobno, np. przy zamianie. - Kotwice —
^i$przypinają wzorzec do początku lub końca linii.
Dlaczego \w nie widzi polskich liter
W silniku wyrażeń regularnych JavaScript, na którym działa to narzędzie, \w zawsze oznacza wyłącznie [A-Za-z0-9_] — litery ASCII, cyfry i podkreślenie. Polskie znaki diakrytyczne ą, ć, ę, ł, ń, ó, ś, ź, ż wykraczają poza ten zakres, więc /^\w+$/.test('łódź') zwróci false już na pierwszej literze. Dodanie flagi u tego nie zmienia — nie rozszerza ona definicji \w. Żeby poprawnie dopasować polski tekst z polskimi znakami, trzeba jawnie użyć klasy opartej na właściwościach Unicode, np. /^\p{L}+$/u, czyli „dowolna litera" dostępna tylko razem z flagą u.
Dopasowanie zachłanne kontra leniwe
Domyślnie kwantyfikatory są „zachłanne" — starają się dopasować jak najwięcej znaków, wycofując się tylko wtedy, gdy uniemożliwia to znalezienie dopasowania. Na przykład <.+> zastosowane do <a>text</a> dopasuje wszystko od pierwszego < do ostatniego >. Dodanie ? po kwantyfikatorze (<.+?>) czyni go „leniwym" — dopasowuje jak najmniej, zatrzymując się na pierwszym możliwym dopasowaniu.
Do czego to się przydaje
- Walidacja formatu danych wejściowych (e-mail, numer telefonu, kod pocztowy).
- Wyszukiwanie i masowa zamiana tekstu na podstawie wzorca, a nie dokładnego dopasowania.
- Wyodrębnianie danych strukturalnych z logów lub niesformatowanego tekstu.
Katastrofalny backtracking
Zagnieżdżone kwantyfikatory, takie jak (a+)+, mogą przy określonych danych wejściowych zmusić silnik regex do sprawdzenia wykładniczej liczby kombinacji, zanim uzna, że dopasowania nie ma — strona lub serwer „zawiesza się" na pozornie prostym wyrażeniu. To realna klasa podatności (ReDoS), dlatego złożone zagnieżdżone kwantyfikatory warto testować na długich, „prawie pasujących" ciągach, a nie tylko na oczekiwanych przykładach.