Wyrażenia Regularne (Regex) w JavaScript - Praktyczny Przewodnik

Wzorzyste, kolorowe nici tworzą geometryczne kształty. Tekst: "Wyrażenia regularne w JavaScript" sugeruje, że wzory te mogą być metaforą złożoności i precyzji.

Napisano przez

Alex Jabłoński

Opublikowano

17 mar 2026

Spis treści

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 danych match() albo exec().
  • Nie używaj regexu tam, gdzie wystarczy includes(), startsWith() lub split().
  • Przy polskich tekstach zwracaj uwagę na flagę u i 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.

What is RegEx?

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)); // true
const 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.

  1. Napisz 5 przykładów, które powinny przejść, i 5, które mają odpaść.
  2. Zacznij od najprostszego wzorca i dodawaj tylko jedną zmianę naraz.
  3. Testuj na danych z polskimi znakami, spacjami i nietypowymi separatorami.
  4. Używaj nazwanych stałych, np. postalCodePattern, zamiast wklejać długi zapis w kilka miejsc.
  5. 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ć.

FAQ - Najczęstsze pytania

Wyrażenia regularne to wzorce służące do dopasowywania, wyszukiwania i manipulowania ciągami znaków w tekście. Pozwalają na definiowanie skomplikowanych reguł, np. do walidacji formatów danych (daty, numery telefonów) czy ekstrakcji konkretnych fragmentów z większego tekstu.

Regex jest idealny do walidacji złożonych formatów, ekstrakcji danych z niestandardowych struktur i wyszukiwania wzorców. Prostsze metody, takie jak `startsWith()`, `endsWith()`, `includes()` czy `split()`, są lepsze dla jednorazowych, prostych sprawdzeń, gdyż są czytelniejsze i mają mniejszy narzut.

Podstawowe elementy to: `.` (dowolny znak), `[]` (zbiór znaków), `\d` (cyfra), `\w` (litera/cyfra), `+` (jedno lub więcej), `*` (zero lub więcej), `^` (początek tekstu), `$` (koniec tekstu) i `()` (grupa przechwytująca). Ich kombinacje pozwalają tworzyć precyzyjne wzorce dopasowania.

W JavaScript najczęściej używa się metod: `test()` do szybkiej weryfikacji (true/false), `match()` do pobierania dopasowań, `search()` do znajdowania pozycji dopasowania oraz `replace()` do zamiany fragmentów tekstu. Dla globalnego wyszukiwania z grupami przydatne są `exec()` lub `matchAll()`.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

wyrażenia regularne wyrażenia regularne javascript przykłady regex js jak używać regex w javascript

Udostępnij artykuł

Alex Jabłoński

Alex Jabłoński

Nazywam się Alex Jabłoński i od 9 lat zajmuję się programowaniem webowym. Moja przygoda z tą dziedziną zaczęła się od prostych projektów, które z czasem przerodziły się w pasję do tworzenia użytecznych i estetycznych aplikacji internetowych. Fascynuje mnie nie tylko sam proces kodowania, ale także to, jak technologie wpływają na nasze życie i jak możemy je wykorzystać, aby rozwiązywać codzienne problemy. Piszę o różnych aspektach programowania, od podstawowych języków po bardziej zaawansowane techniki i narzędzia. Staram się, aby moje teksty były przystępne i zrozumiałe, a skomplikowane zagadnienia przedstawiam w prosty sposób. Regularnie śledzę nowinki w branży, co pozwala mi dostarczać aktualne i rzetelne informacje. Moim celem jest nie tylko edukacja, ale także inspirowanie innych do rozwijania swoich umiejętności w programowaniu.

Napisz komentarz