Wyrażenia regularne
[Strona w budowie]
Poniżej znajdziesz omówienie najważniejszych elementów wyrażeń regularnych (tzw. regexów) na przykładzie podanych wzorców oraz wyjaśnienie, jak w ogóle podchodzi się do ich tworzenia. Dzięki temu łatwiej zrozumiesz, dlaczego pewne fragmenty wyglądają tak, a nie inaczej i jak działają „pod maską”.
Podstawy składni wyrażeń regularnych
Znaki specjalne (metaznaki) – np.:
^
– początek ciągu lub linii (w zależności od trybu),$
– koniec ciągu lub linii,.
– dowolny znak (zwykle poza znakiem nowej linii),\b
– granica słowa (tzw. word boundary),\d
– odpowiada cyfrom ([0-9]
),\s
– odpowiada białym znakom (spacja, tabulator, nowa linia itp.),\w
– odpowiada „słowotwórczym” znakom (litery, cyfry, podkreślnik),[...]
– klasa znaków, np.[0-9]
oznacza dowolną cyfrę z przedziału 0–9,(...)
– grupowanie lub tzw. grupa przechwytująca (ang. capturing group),(?:...)
– grupa nieprzechwytująca (non-capturing group),|
– alternatywa (logiczne „lub”),*
,+
,?
,{n}
,{n,m}
– kwantyfikatory (opisują, ile razy ma się powtórzyć dany fragment).
Kwantyfikatory:
*
– 0 lub więcej powtórzeń,+
– 1 lub więcej powtórzeń,?
– 0 lub 1 powtórzenie,{n}
– dokładnie n powtórzeń,{n,}
– co najmniej n powtórzeń,{n,m}
– od n do m powtórzeń.
Granice słowa (\b
)
\b
)Jest to specjalny „znak” regexu, który wskazuje na przejście między znakami słowa (literami, cyframi, znakiem podkreślenia) a znakami niebędącymi słowem (spacją, znakiem interpunkcyjnym itp.) lub na początek/koniec ciągu.
\b\d{2}-\d{3}\b
oznacza: szukaj dokładnie dwóch cyfr, myślnika, trzech cyfr i sprawdź, czy na początku i końcu tego wzorca jest granica słowa.
Omówienie przykładowych wyrażeń regularnych
Wzorzec PESEL
\b
na początku i na końcu – upewnia się, że pasujące cyfry są wyodrębnione jako całe słowo (innymi słowy – przed i po tym ciągu nie ma dalszych znaków słowa).[0-9]{11}
– szukamy ciągu dokładnie 11 cyfr (od 0 do 9).
Zastosowanie: Znajdzie ciąg typu 98012345678
, ale nie dopasuje czegoś takiego jak 12345678901abc
(ponieważ zaraz po cyfrach jest litera, więc nie ma granicy słowa).
Adres e-mail
[a-zA-Z0-9._%+-]+
– jedna lub więcej (+
) liter (małe i duże), cyfr, kropek, podkreśleń, procentów, plusów, minusów. Krótko mówiąc, znaki dozwolone w większości adresów e-mail w części przed „@”.@
– dosłownie znak „małpy”.[a-zA-Z0-9.-]+
– jedna lub więcej liter (małe/duże), cyfr, kropek lub myślników w części domenowej (np.gmail.com
,moj-serwer.pl
itp.).\.
– znak kropki (przed kropką mamy backslash, żeby „.” nie oznaczało dowolnego znaku).[a-zA-Z]{2,}
– co najmniej dwie litery jako końcówka domeny, np..pl
,.com
,.info
.
Zastosowanie: Wykryje adresy e-mail w typowym formacie, np. john.smith@example.com
. Nie sprawdza jednak szczegółowych reguł (np. nie dopuszcza znaków narodowych) i nie weryfikuje, czy dana domena rzeczywiście istnieje.
Numer telefonu (np. 123-456-789)
\b
– granica słowa.\d{3}
– trzy cyfry.[-.\s]?
– znak myślnika, kropki lub spacji, który może wystąpić 0 lub 1 raz. Dzięki temu dopuszczamy formaty w rodzaju123 456 789
,123-456-789
, czy123.456.789
.Ponownie
\d{3}[-.\s]?
– kolejne trzy cyfry i opcjonalny separator.\d{3}
– ostatnie trzy cyfry.\b
– koniec słowa.
Zastosowanie: Znajdzie numer telefonu podzielony na bloki 3-cyfrowe, a dzięki ?
(opcjonalnym separatorom) zignoruje format zapisu separatora (spacja, myślnik, kropka) lub jego brak.
Adres IPv4
Możesz też spotkać zapis:
Konstrukcja
25[0-5]
pozwala na dopasowanie liczb z zakresu 250–255,2[0-4]\d
– liczby 200–249,[0-1]?\d?\d
– liczby 0–199 (w uproszczeniu).( ... )\.
– taka grupa zakończona kropką i powtórzona{3}
razy oznacza, że mamy cztery oktety (każdy z nich musi spełniać warunek powyższy) oddzielone kropkami.\b
– granica słowa na początku i końcu, aby przypadkowo nie „wyłapać” czegoś, co w środku nie jest adresem.
Zastosowanie: Takie wyrażenie sprawdza, czy mamy do czynienia z prawidłowym adresem IPv4 w rodzaju 192.168.1.1
czy 255.255.255.255
, a nie np. 256.300.1.999
.
Numer karty kredytowej
\b
– granica słowa.(?: ...)
– grupa nieprzechwytująca (tzw. non-capturing). Nie tworzy odrębnego „grupowania” zapisywanego w pamięci, jedynie mówi regexowi, co ma powtarzać.\d[ -]*?
– jedna cyfra, po której może wystąpić dowolna liczba myślników, spacji itp. (zmodyfikowane przez*?
, co oznacza „minimalne dopasowanie” – lazy quantifier). Dzięki temu możemy przeskakiwać po ewentualnych separatorach (spacjach, myślnikach) w numerach kart.{13,16}
– szukamy takich ciągów od 13 do 16 „bloków” (cyfr) w sumie.\b
– ponownie granica słowa.
Zastosowanie: Pozwala znaleźć ciąg cyfr długości 13–16, nawet jeśli jest zapisywany z myślnikami czy spacjami, np. 1234-5678-1234-5678
, 1234 5678 1234 9999
lub 1234567890123456
.
Kod pocztowy w formacie polskim (XX-XXX)
\b
– granica słowa.\d{2}
– dwie cyfry.-
– dosłownie myślnik.\d{3}
– trzy cyfry.\b
– koniec słowa.
Zastosowanie: Znajdzie polski kod pocztowy typu 01-234
, 50-001
itp. Nie weryfikuje co prawda, czy kod pocztowy realnie istnieje, ale sam format jest prawidłowy.
Jak tworzyć własne wyrażenia regularne?
Określ dokładny wzorzec, jaki chcesz wyłapać. Zastanów się, jakie reguły musi spełniać ciąg znaków (czy wszystkie to cyfry, czy litery, jaka jest dopuszczalna długość, czy występują separatory itd.).
Wybierz odpowiednie klasy znaków. Jeśli potrzebujesz tylko cyfr, używaj
\d
lub[0-9]
. Gdy chcesz liter, zastanów się, czy w grę wchodzą tylko małe/duże, czy również polskie znaki diakrytyczne.Zastosuj kwantyfikatory (ile razy powtarza się dany wzorzec?).
Dokładnie określ minimalną i maksymalną liczbę powtórzeń za pomocą
{m,n}
.Jeśli ma występować separator opcjonalnie, zastosuj
?
.Jeżeli znak może powtórzyć się wiele razy, rozważ
*
lub+
.
Użyj granic (np.
^
,$
,\b
) By uniknąć dopasowań w środku innego tekstu, sprawdź, czy potrzebna jest granica słowa\b
bądź początek/koniec ciągu^ ... $
.Testuj krok po kroku. Możesz skorzystać z narzędzi online (np. regex101.com), żeby widzieć, jak Twoje wyrażenie łapie (lub nie) konkretne przykłady.
Podsumowanie
Wyrażenia regularne pozwalają w bardzo precyzyjny (choć czasem nieco skomplikowany) sposób definiować, co chcemy „wyłapać” z tekstu. Każdy z powyższych przykładów:
Wykorzystuje klasy znaków (
[0-9]
,[a-zA-Z]
,\d
, itp.).Definiuje liczbę powtórzeń poprzez kwantyfikatory (
+
,{n}
,{n,m}
).Stosuje granice słowa
\b
, by dopasować całe byty (jak cały PESEL czy cały kod pocztowy), a nie fragmenty dłuższego ciągu.
Gdy zrozumiesz działanie podstawowych elementów (klasy znaków, kwantyfikatory, grupy, granice), tworzenie i dostosowywanie wyrażeń regularnych do własnych potrzeb stanie się znacznie prostsze.
Jeśli dopiero zaczynasz, polecam przetestować każde z tych wyrażeń „na żywo” w jakimś regex-testerze online, wpisując przykładowe dane i patrząc, które fragmenty tekstu się „zaznaczają”. Dzięki temu szybko zobaczysz, jak drobna zmiana w regexie wpływa na dopasowanie.
Last updated
Was this helpful?