Wyrażenia regularne mają reputację wyglądających jak losowy szum. Wzorzec taki jak ^[\w.-]+@[\w-]+\.\w{2,}$ może wyglądać, jakby kot chodził po klawiaturze. Ale za zagadkową składnią kryje się niezwykle elegancki pomysł: zwięzły język do opisywania wzorców w tekście.
Niezależnie od tego, czy walidujesz pola formularzy, przeszukujesz pliki logów, oczyszczasz dane czy wykonujesz znajdź-i-zamień w całej bazie kodu, regex jest jednym z najbardziej wszechstronnych narzędzi w zestawie programisty. I nie musisz zapamiętywać każdej niejasnej funkcji, by czerpać z niego realną wartość. Garstka elementów składowych pokrywa zdecydowaną większość praktycznych zastosowań.
Co właściwie robi regex
Wyrażenie regularne (regex lub regexp) to wzorzec opisujący zbiór ciągów znaków. Podajesz go silnikowi wyszukiwania — w swoim języku programowania, edytorze tekstu lub narzędziu wiersza poleceń — a on znajduje każdy ciąg, który pasuje.
Pomyśl o tym jak o zaawansowanym zapytaniu wyszukiwania:
- Zwykłe wyszukiwanie: znajdź dokładne słowo „error"
- Wyszukiwanie regex: znajdź cokolwiek, co wygląda jak adres IP, data, adres e-mail lub dowolna struktura, którą potrafisz opisać
Regex został wynaleziony przez matematyka Stephena Kleene'a w 1956 roku i wszedł do informatyki przez edytory tekstu Unix w latach 60. Dziś jest obsługiwany praktycznie w każdym języku programowania i edytorze tekstu.
Elementy składowe
Znaki literalne
Najprostszy regex to zwykły tekst. Wzorzec hello pasuje do ciągu „hello" wszędzie, gdzie się pojawia. Nic skomplikowanego.
Kropka (.) — dowolny znak
Kropka pasuje do dowolnego pojedynczego znaku z wyjątkiem znaku nowej linii.
h.tpasuje do „hat", „hit", „hot", „h3t", a nawet „h t"
Klasy znaków ([])
Nawiasy kwadratowe definiują zbiór dozwolonych znaków na jednej pozycji.
[aeiou]— dowolna samogłoska[0-9]— dowolna cyfra[A-Za-z]— dowolna litera[^0-9]— dowolny znak, który NIE jest cyfrą (^wewnątrz nawiasów oznacza „nie")
Skrócone klasy
| Skrót | Znaczenie | Odpowiednik |
|---|---|---|
\d |
Dowolna cyfra | [0-9] |
\w |
Znak słowny | [A-Za-z0-9_] |
\s |
Biały znak | [ \t\n\r] |
\D |
Nie cyfra | [^0-9] |
\W |
Nie znak słowny | [^A-Za-z0-9_] |
\S |
Nie biały znak | [^ \t\n\r] |
Kwantyfikatory — ile razy
Kwantyfikatory kontrolują, ile razy poprzedzający element musi się pojawić.
| Symbol | Znaczenie | Przykład | Pasuje do |
|---|---|---|---|
* |
Zero lub więcej | ab*c |
„ac", „abc", „abbc" |
+ |
Jeden lub więcej | ab+c |
„abc", „abbc" (nie „ac") |
? |
Zero lub jeden | colou?r |
„color" i „colour" |
{3} |
Dokładnie 3 | \d{3} |
„123", „456" |
{2,4} |
Od 2 do 4 | \d{2,4} |
„12", „123", „1234" |
Kotwice — pozycja
^— początek ciągu (lub linii, z flagąm)$— koniec ciągu (lub linii)\b— granica słowa
Wzorzec ^\d{4}$ pasuje do ciągu, który jest dokładnie czterema cyframi, jak „2026", ale nie „abc2026" czy „2026xyz".
Grupy i alternatywy
(abc)— przechwytuje „abc" jako grupęa|b— pasuje do „a" lub „b"(cat|dog)— pasuje do „cat" lub „dog"
Grupy pozwalają też stosować kwantyfikatory do sekwencji: (ha)+ pasuje do „ha", „haha", „hahaha".
Typowe praktyczne wzorce
Walidacja e-maila (podstawowa)
^[\w.-]+@[\w-]+\.\w{2,}$
To pasuje do user@example.com, first.last@company.co.uk (częściowo) i odrzuca ciągi bez @ lub domeny.
Ważne: Perfekcyjna walidacja adresów e-mail za pomocą regex jest notorycznie trudna — pełna specyfikacja RFC 5322 jest niezwykle złożona. W systemach produkcyjnych użyj podstawowego regex do sprawdzenia formatu, a następnie zweryfikuj adres, wysyłając e-mail potwierdzający.
Dopasowanie numeru telefonu
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
To obsługuje formaty takie jak +1 555 123 4567, 555-123-4567 i (555) 123-4567.
Dopasowanie URL
https?://[\w.-]+(/[\w./?&=-]*)?
Pasuje do https://example.com, http://example.com/path?q=hello.
Dopasowanie daty (RRRR-MM-DD)
\d{4}-\d{2}-\d{2}
Pasuje do 2026-03-29, 1999-12-31. Uwaga: to sprawdza tylko format, nie poprawność — pasowałoby też do 9999-99-99.
Flagi zmieniające zachowanie
Większość silników regex obsługuje flagi modyfikujące sposób stosowania wzorca:
| Flaga | Nazwa | Efekt |
|---|---|---|
g |
Globalny | Znajdź wszystkie dopasowania, nie tylko pierwsze |
i |
Bez rozróżniania wielkości liter | hello pasuje do „Hello", „HELLO" itp. |
m |
Wieloliniowy | ^ i $ pasują do początku/końca każdej linii |
s |
Dotall | . pasuje również do znaków nowej linii |
W JavaScript flagi dodaje się po zamykającym ukośniku: /hello/gi. W Pythonie przekazuje się je jako argumenty: re.findall(r"hello", text, re.IGNORECASE).
Kiedy regex to przesada
Regex jest potężny, ale nie zawsze jest właściwym narzędziem:
- Parsowanie HTML lub XML. Użyj właściwego parsera DOM. Regex nie potrafi niezawodnie obsłużyć zagnieżdżonych tagów.
- Parsowanie JSON. Użyj
JSON.parse()lub odpowiednika. Regex zawiedzie na przypadkach brzegowych. - Złożona walidacja. Jeśli Twój wzorzec obejmuje wiele linii i czytanie go zajmuje pięć minut, rozważ napisanie proceduralnego kodu walidacyjnego.
- Proste operacje na ciągach. Jeśli potrzebujesz tylko
startsWith(),includes()czysplit(), zwykłe metody ciągów są czytelniejsze i szybsze.
Typowe pułapki
- Zapomnienie o znakowaniu specjalnym znaków. Kropka
.pasuje do dowolnego znaku. By dopasować literalną kropkę, użyj\.. Tak samo dla(,),[,],+,*,?,{,},^,$,|i\. - Zachłanne vs leniwe dopasowanie. Domyślnie
.*jest zachłanne — dopasowuje jak najwięcej. Dodaj?, by uczynić je leniwym:.*?dopasowuje jak najmniej. Ma to znaczenie przy ekstrakcji treści między ogranicznikami. - Katastrofalne nawracanie. Zagnieżdżone kwantyfikatory jak
(a+)+mogą spowodować, że silnik próbuje wykładniczej liczby ścieżek dla pewnych danych wejściowych, zamrażając program. Unikaj zagnieżdżonej repetycji na nakładających się wzorcach. - Zapomnienie o kotwicach. Bez
^i$wzorzec pasuje do podciągów.\d{3}pasuje do „123" wewnątrz „abc12345". Użyj^\d{3}$, jeśli potrzebujesz dokładnego dopasowania.
Więcej informacji
Najlepszym sposobem na naukę regex jest eksperymentowanie. Wpisz wzorzec, wklej tekst testowy i zobacz, co się podświetli. Dostosuj i powtarzaj, aż zrozumiesz, jak działa każdy element.
- Jak testować wzorce regex — interaktywny samouczek z przykładami
- Tester regex — wklej swój wzorzec i dane testowe, zobacz dopasowania podświetlone w czasie rzeczywistym
