W kodzie często trzeba sprawdzić, czy tekst ma konkretny układ: datę, numer telefonu, fragment adresu e-mail albo kod pocztowy. Do takich zadań służą wyrażenia regularne, czyli wzorce do dopasowywania znaków w łańcuchach tekstowych. W tym artykule pokazuję, jak je czytać, jak testować w JavaScript i kiedy lepiej sięgnąć po prostsze operacje na stringach.
Najważniejsze rzeczy, które warto zapamiętać
- Regex przydaje się do wyszukiwania, walidacji i wyciągania fragmentów tekstu.
- Najpierw naucz się kilku klocków:
[],\d,+,*,^,$i(). - W JavaScript do szybkiego sprawdzania używaj
test(), a do wyciągania danychmatch()alboexec(). - Nie używaj regexu tam, gdzie wystarczy
includes(),startsWith()lubsplit(). - Przy polskich tekstach zwracaj uwagę na flagę
ui znaki diakrytyczne.
Jak działają wzorce dopasowania w praktyce
Na co dzień traktuję ten mechanizm jak filtr: dostaje tekst i sprawdza, czy mieści się w określonym układzie. Dzięki temu szybciej wyłapuję numery, daty, kody i fragmenty, które trzeba przerobić, ale nie chciałbym używać go do wszystkiego. Dobry wzorzec oszczędza czas, zły tylko ukrywa błąd za skomplikowaną składnią.
Najważniejsze jest to, że regex nie opisuje całego języka, tylko regułę dopasowania. To dlatego ten sam zapis może sprawdzać poprawność, wyszukiwać fragmenty albo wycinać dane z większego tekstu. Gdy dobrze rozumiesz tę różnicę, reszta zaczyna być przewidywalna.
Żeby to działało bez zgadywania, trzeba opanować kilka podstawowych klocków składni. Właśnie one pozwalają przejść od „mniej więcej wiem, o co chodzi” do czytelnego, konkretnego wzorca.

Jak czytać składnię bez zgadywania
Najprościej myśleć o regexie jak o zestawie instrukcji: które znaki są dozwolone, ile ich może być i gdzie ma zaczynać się albo kończyć dopasowanie. W JavaScript zapisuję taki wzorzec najczęściej między ukośnikami, np. /kot/i, albo tworzę go przez new RegExp(), gdy składam go dynamicznie z danych.
const r1 = /kot/i;
const r2 = new RegExp("kot", "i");Druga forma przydaje się wtedy, gdy wzorzec buduję z wartości użytkownika, ale wymaga staranniejszego escapowania znaków specjalnych. To cena za elastyczność, nie błąd samej techniki.
| Element | Znaczenie | Przykład |
|---|---|---|
. |
Dowolny znak, zwykle poza nową linią |
a.c dopasuje abc i a-c
|
[] |
Zbiór dozwolonych znaków |
[abc] pasuje do a, b lub c
|
\d |
Cyfra |
\d{2} oznacza dwie cyfry |
\w |
Litera, cyfra lub _
|
\w+ łapie ciąg znaków „słownych” |
+ |
Jeden lub więcej powtórzeń |
a+ pasuje do a, aa, aaa
|
* |
Zero lub więcej powtórzeń |
a* dopasuje też pusty ciąg |
^ i $
|
Początek i koniec tekstu |
^abc$ pasuje tylko do całego abc
|
() |
Grupa przechwytująca | (\d{2})-(\d{2})-(\d{4}) |
| |
Alternatywa | kot|pies |
W polskich tekstach nie pomijam jeszcze jednego szczegółu: \w bywa zbyt „angielskie”. Jeśli wzorzec ma akceptować litery z polskimi znakami, lepiej sięgnąć po Unicode property escapes, np. \p{L}, i dodać flagę u.
const namePattern = /^[\p{L} '-]+$/u;Taki zapis pozwala dopasować imiona i nazwiska z diakrytykami bez kombinowania z ręcznymi zakresami. Kiedy już umiesz czytać te klocki, naturalnym kolejnym krokiem jest sprawdzanie wzorca na konkretnych stringach.
Jak sprawdzać dopasowanie w JavaScript
W praktyce najczęściej używam czterech metod: test() do odpowiedzi tak/nie, match() do pierwszego dopasowania, search() do pozycji w tekście i replace() do podmiany fragmentu. Jeśli potrzebuję wszystkich trafień z grupami, sięgam raczej po exec() lub matchAll().
| Metoda | Co zwraca | Kiedy jej używam |
|---|---|---|
test() |
true albo false
|
Gdy chcę szybko sprawdzić, czy tekst pasuje |
match() |
Dopasowanie lub tablicę dopasowań | Gdy chcę odczytać znaleziony fragment |
search() |
Indeks pierwszego trafienia | Gdy liczy się pozycja w tekście |
replace() |
Nowy string po zamianie | Gdy chcę oczyścić albo przekształcić tekst |
const text = "00-001";
const postalCodePattern = /^[0-9]{2}-[0-9]{3}$/;
console.log(postalCodePattern.test(text)); // trueconst date = "12-06-2026";
const datePattern = /^(\d{2})-(\d{2})-(\d{4})$/;
const match = date.match(datePattern);
if (match) {
const [, day, month, year] = match;
console.log(day, month, year);
}Przy fladze g warto uważać, bo wielokrotne wywoływanie test() na tym samym obiekcie może dawać zaskakujące wyniki przez lastIndex. Do prostego sprawdzenia obecności wzorca wolę więc wersję bez g, a globalne wyszukiwanie zostawiam do sytuacji, w których naprawdę potrzebuję wielu trafień.
Gdy już umiesz to testować, zaczyna być jasne, gdzie taki mechanizm daje realny zysk, a gdzie tylko dokłada złożoność. To ważne rozróżnienie, bo nie każdy problem tekstowy warto rozwiązywać w ten sam sposób.
Gdzie ten mechanizm naprawdę oszczędza czas
Najwięcej sensu widzę w czterech typach zadań: walidacji prostych formatów, wyciąganiu fragmentów z logów i wiadomości, porządkowaniu danych przed zapisem oraz wyszukiwaniu treści według reguł, a nie tylko po dokładnym ciągu znaków. Wzorzec jest tu szybszy niż ręczne sprawdzanie wielu warunków i zwykle czytelniejszy niż rozbudowane łańcuchy if.
- Walidacja - kod pocztowy, data, numer telefonu, prosty identyfikator.
- Ekstrakcja - numer zamówienia, część adresu e-mail, tag z tekstu.
- Porządkowanie - usuwanie nadmiarowych spacji, powtarzających się separatorów, znaków spoza dozwolonego zestawu.
- Wyszukiwanie - wszystkie słowa zaczynające się od określonego prefiksu albo kończące konkretną końcówką.
- Normalizacja - zamiana kilku wariantów zapisu na jeden standard przed dalszym przetwarzaniem.
Jeśli problem pasuje do jednego z tych scenariuszy, regex zwykle daje realny zysk. Gdy jednak tekst ma bardziej chaotyczną strukturę, lepiej od razu rozważyć inne narzędzie, bo tutaj zaczyna się granica wygody.
Ta granica jest ważna, bo wiele osób nadużywa wzorców tam, gdzie wystarcza prostsza operacja na stringu. Właśnie wtedy kod robi się trudniejszy do utrzymania, mimo że na pierwszy rzut oka wygląda „sprytniej”.
Kiedy prostsze operacje tekstowe wygrywają
Granica między wzorcem a zwykłymi metodami tekstowymi jest prostsza, niż się wydaje: pytam, czy potrzebuję reguły opisującej wiele wariantów, czy tylko jednego prostego sprawdzenia. To rozróżnienie oszczędza mi sporo niepotrzebnego kodu.
| Zadanie | Lepszy wybór | Dlaczego |
|---|---|---|
| Sprawdzenie prefiksu | startsWith() |
czytelniejsze niż wzorzec |
| Sprawdzenie sufiksu | endsWith() |
bez składni regex |
| Szukanie prostego fragmentu | includes() |
najmniej narzutu |
| Dzielenie po separatorze | split() |
prościej i jaśniej |
| Zamiana stałego tekstu | replace() |
regex nie jest potrzebny |
| Walidacja złożonego formatu | regex | tu wzorzec daje elastyczność |
| Parsowanie HTML lub JSON | parser | wzorzec jest zbyt kruchy |
W skrócie: jeśli problem da się opisać jednym prostym warunkiem, nie komplikuję go na siłę. Regex wygrywa dopiero tam, gdzie ten sam schemat ma działać na wielu podobnych ciągach i musi uwzględniać warianty, których zwykłe metody nie pokryją wygodnie.
Im szybciej rozpoznasz ten moment, tym mniej czasu stracisz na przepisywanie prostych zadań na zbyt skomplikowane wzorce. A kiedy już naprawdę potrzebujesz elastycznego dopasowania, warto ćwiczyć je w małych, kontrolowanych krokach.
Jak ćwiczyć, żeby wzorce przestały wyglądać jak szyfr
Najlepiej uczę się tego tematu przez małe, konkretne zadania. Zamiast próbować zapamiętać całą składnię, biorę jeden realny string i dokładam kolejne reguły: dozwolone znaki, długość, kotwice, a dopiero potem grupy i alternatywy.
- Napisz 5 przykładów, które powinny przejść, i 5, które mają odpaść.
- Zacznij od najprostszego wzorca i dodawaj tylko jedną zmianę naraz.
- Testuj na danych z polskimi znakami, spacjami i nietypowymi separatorami.
- Używaj nazwanych stałych, np.
postalCodePattern, zamiast wklejać długi zapis w kilka miejsc. - Gdy wzorzec robi się trudny do przeczytania po minucie, podziel zadanie na prostsze kroki albo przerzuć część logiki do zwykłego kodu.
Jeśli mam zostawić jedną zasadę, brzmi ona tak: dobry regex upraszcza pracę z tekstem, ale nie powinien zastępować myślenia o strukturze danych. Gdy opanujesz kilka podstawowych symboli i zaczniesz testować każdy wzorzec na prawdziwych przykładach, ten temat przestaje być czarną magią i zaczyna po prostu pomagać.