- English
- Español
- Français
- Português do Brasil
- 中文版
- 日本語
- 한국어
- Turkish
- Greek
- Magyar
- Polish
- Русский
- Tiếng Việt
- فارسی
- עברית
Wyrażenie regularne to grupa znaków lub symboli, które służą do odnalezienia określonego wzoru w tekście.
Wyrażenie regularne to wzorzec, który jest dopasowywany do tekstu od lewej do prawej strony. Termin "wyrażenie regularne" (ang. "regular expression") jest dość długie, więc zazwyczaj używa się skróconej formy "regex" lub "regexp". Wyrażenie regularne jest używane do zastępowania tekstu w łańcuchu znaków (ang. string), walidacji formularzy, wyodrębniania wycinka z łańcucha (ang. substring) według podanego wzorca, i wielu innych.
Wyobraź sobie, że piszesz aplikację i chcesz ustawić reguły dotyczące tego, jak użytkownik wybiera swoją nazwę. Chcemy, aby nazwa użytkownika zawierała litery, liczby, podkreślenia i myślniki. Chcemy również ograniczyć liczbę znaków w nazwie użytkownika, aby nie wyglądała za brzydko. Stosujemy następujące wyrażenie regularne, aby sprawdzić poprawność nazwy:
Powyższe wyrażenie akceptuje łańcuchy john_doe
, jo-hn_doe
i john12_as
. Odrzuca Jo
ponieważ łańcuch zawiera dużą literę
i jest za krótki.
Wyrażenie regularne to ciąg znaków, których używamy do przeszukania tekstu.
Na przykład, wyrażenie the
oznacza: literę t
, następującą
po niej literę h
, następującą po niej literę e
.
"the" => The fat cat sat on the mat.
Wyrażenie regularne 123
pasuje do łańcucha 123
. Wyrażenie regularne
jest dopasowywane do danego łańcucha poprzez porównanie każdego znaku,
jeden po drugim, w wyrażeniu i łańcuchu. Wyrażenia są zwykle wrażliwe
na wielkość znaków, więc wyrażenie The
nie pasuje do łańcucha the
.
"The" => The fat cat sat on the mat.
Metaznaki to składowe elementy wyrażeń regularnych. Znaki te, nie oznaczają siebie samych, są natomiast interpretowane w specjalny sposób. Niektóre znaki mają specjalne znaczenie i są zapisywane w kwadratowych nawiasach. Metaznaki to:
Metaznaki | Opis |
---|---|
. | Dowolny znak z wyjątkiem nowej linii. |
[ ] | Zakres. Każdy znak zapisany w kwadratowym nawiasie. |
[^ ] | Odwrócony zakres. Każdy znak, który nie znajduje się w kwadratowym nawiasie. |
* | 0 lub więcej poprzedzających znaków. |
+ | 1 lub więcej poprzedzających znaków. |
? | 0 lub 1 poprzedzających znaków. |
{n,m} | Minimum "n" ale nie więcej niż "m" poprzedzających znaków. |
(xyz) | Grupowanie znaków. Znaki xyz dokładnie w tej kolejności. |
| | Alternatywa. Znaki przed symbolem lub za symbolem. |
\ | Znak ucieczki. Umożliwia używanie zarezerwowanych znaków [ ] ( ) { } . * + ? ^ $ \ | . |
^ | Oznacza początek wzorca. |
$ | Oznacza koniec wzorca. |
Kropka .
jest najprostszym przykładem metaznaku. Oznacza dowolny znak z wyłączeniem entera
i znaków nowej linii. Na przykład, wyrażenie regularne .ar
oznacza: dowolny znak, następującą
po niej literę a
, następującą po niej literę r
.
".ar" => The car parked in the garage.
Zestawy znaków nazywane też klasami znaków. Nawiasy kwadratowe służą do określenia zestawów znaków.
Użycie myślnika wewnątrz zestawu, określa jego zakres. Kolejność znaków w nawiasach kwadratowych
nie ma znaczenia. Na przykład wyrażenie [Tt]he
oznacza: dużą literę T
lub małą t
,
następującą po niej literę h
, następującą po niej literę e
.
"[Tt]he" => The car parked in the garage.
Jednak kropka w zestawie znaków, oznacza dosłownie kropkę. Wyrażenie regularne
ar[.]
oznacza: małą literę a
, następującą po niej literę r
,
następującą po niej .
kropkę.
"ar[.]" => A garage is a good place to park a car.
Generalnie znak karety oznacza początek wyrażenia, ale gdy zostanie użyty zaraz
za otwierającym nawiasem kwadratowym, odwraca zestaw znaków. Na przykład
wyrażenie [^c]ar
oznacza: każdy znak z wyjątkiem c
,
następującą po niej literę a
, następującą po niej literę r
.
"[^c]ar" => The car parked in the garage.
Następujące metaznaki +
, *
czy ?
określają ile razy wzorzec może się powtórzyć.
Te metaznaki zachowują się różnie, w zależności od sytuacji.
Symbol *
oznacza zero lub więcej powtórzeń poprzedzających znaków. Wyrażenie
regularne a*
oznacza: zero lub więcej powtórzeń poprzedzającej małej
litery a
. Ale jeśli występuje po zestawie znaków lub klasie, to oznacza
powtórzenia całego zestawu lub klasy. Na przykład, wyrażenie regularne
[a-z]*
oznacza: każdy ciąg znaków pisany małymi literami.
"[a-z]*" => The car parked in the garage #21.
Symbol *
może być użyty z metaznakiem .
by oznaczyć każdy łańcuch
znaków .*
. Symbol *
może być użyty ze znakiem \s
by znaleźć łańcuch zawierający spacje. Na przykład, wyrażenie
\s*cat\s*
oznacza: zero lub więcej spacji, następującą po niej małą literę c
,
następującą po niej małą literę a
, następującą po niej małą literę t
,
następujące po niej zero lub więcej spacji.
"\s*cat\s*" => The fat cat sat on the concatenation.
Symbol +
oznacza jeden lub więcej powtórzeń poprzedzających znaków. Na przykład,
wyrażenie c.+t
oznacza: małą literę c
, następujący po niej przynajmniej jeden
dowolny znak, następującą po nim małą literę t
. W tym wypadku t
jest ostatnim
t
w zdaniu.
"c.+t" => The fat cat sat on the mat.
W wyrażeniach regularnych znak ?
sprawia, że poprzedzający znak jest opcjonalny.
Ten symbol oznacza zero lub jedno wystąpienie poprzedzającego znaku. Na przykład,
wyrażenie regularne [T]?he
oznacza: opcjonalną dużą literę T
, następującą
po niej małą literę h
, następującą po niej małą literę e
.
"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.
W wyrażeniach regularnych, klamry zwane również kwantyfikatorami, używane są
do określenia, ile razy znak lub grupa znaków może się powtórzyć.
Na przykład wyrażenie regularne [0-9]{2,3}
oznacza: przynajmniej
2 znaki, ale nie więcej niż 3 (znaki z zakresu od 0 do 9).
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
Możemy opuścić drugą liczbę. Na przykład regularne wyrażenie [0-9]{2,}
oznacza: 2 lub więcej znaków. Jeżeli dodatkowo usuniemy przecinek,
to wyrażenie [0-9]{3}
oznacza: dokładnie 3 znaki z zakresu 0 do 9.
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
Grupa znaków to grupa podwzorców, które zapisywane są w nawiasach (...)
.
Jak wspominaliśmy wyżej, jeśli w wyrażeniu regularnym wstawimy kwantyfikator po
znaku, wtedy powtórzy on ten znak. Ale gdy wstawimy kwantyfikator po grupie znaków,
wtedy cała grupa zostanie powtórzona. Na przykład wyrażenie regularne (ab)*
oznacza zero lub więcej powtórzeń grupy "ab". Możemy także użyć metaznaku
alternatywy |
wewnątrz grupy. Na przykład wyrażenie (c|g|p)ar
oznacza: małą literę c
,
g
lub p
, następującą po niej literę a
, następującą po niej literę r
.
"(c|g|p)ar" => The car is parked in the garage.
W wyrażeniach regularnych pionowa kreska |
oznacza alternatywę.
Działa jak warunek pomiędzy różnymi wyrażeniami. Teraz możesz pomyśleć, że
to działa tak samo jak zestaw znaków. Różnica polega na tym, że zestaw znaków
działa na poziomie znaków, natomiast alternatywa na poziomie wyrażenia. Na przykład
wyrażenie regularne (T|t)he|car
oznacza: dużą literę T
lub małą t
,
następującą po niej literę h
, następującą po niej literę e
lub c
, następującą
po niej literę a
, następującą po niej literę r
.
"(T|t)he|car" => The car is parked in the garage.
Ukośnik \
w wyrażeniach regularnych jest znakiem ucieczki. Pozwala on
używać w wyrażeniu zarezerwowanych znaków takich jak { } [ ] / \ + * . $ ^ | ?
.
Aby użyć znaku specjalnego w wyrażeniu, postaw \
przed nim.
Na przykład wyrażenie .
dopasowuje każdy znak z wyjątkiem nowej linii.
Żeby dopasować kropkę .
w wyrażeniu regularnym, trzeba wstawić przed nią ukośnik.
Wyrażenie (f|c|m)at\.?
oznacza: małe litery f
lub c
lub m
, następującą po niej
literę a
, następującą po niej literę t
, następującą kropkę .
, która jest opcjonalna.
"(f|c|m)at\.?" => The fat cat sat on the mat.
W wyrażeniach regularnych używamy kotwic aby sprawdzić czy dopasowywany symbol
jest pierwszym lub ostatnim symbolem w łańcuchu. Są dwa typy: pierwszy to
kareta ^
, która sprawdza czy znak jest początkiem łańcucha, drugi to dolar $
,
który sprawdza czy znak jest ostatnim elementem łańcucha.
Kareta ^
sprawdza czy znak jest początkiem łańcucha. Jeżeli użyjemy takiego
wyrażenia ^a
(jeśli a jest pierwszym znakiem) na łańcuchu abc
to dopasuje
nam a
. Ale jeśli użyjemy takiego wyrażenia ^b
na tym samym łańcuchu, to nie
zwróci nam nic. Ponieważ w łańcuchu abc
"b" nie jest pierwszym symbolem.
Spójrzmy teraz na wyrażenie ^(T|t)he
które oznacza: dużą literę T
lub małą
t
, która jest początkiem łańcucha, następującą po niej literę h
, następującą
po niej literę e
.
"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
Symbol dolara $
używany jest do sprawdzenia czy dopasowywany znak jest ostatni
w łańcuchu. Na przykład, wyrażenie regularne (at\.)$
oznacza: małą literę a
,
następującą po niej literę t
, następującą po niej kropkę .
i na dodatek
dopasowanie musi być końcem łańcucha.
"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat. sat. on the mat.
W wyrażeniach regularnych znajdziemy także skróty dla popularnych zestawów znaków, które ułatwiają pracę z wyrażeniami regularnymi. Skróty wyglądają następująco:
Skrót | Opis |
---|---|
. | Każdy znak z wyjątkiem nowej linii |
\w | Znaki alfanumeryczne: [a-zA-Z0-9_] |
\W | Znaki nie alfanumeryczne: [^\w] |
\d | Cyfry: [0-9] |
\D | Nie cyfry: [^\d] |
\s | Dowolny biały znak: [\t\n\f\r\p{Z}] |
\S | Każdy znak oprócz białych: [^\s] |
Lookbehind i lookahead (nazywane również lookaround) to specyficzne typy
niezwracających grup (dopasowują wzorzec, ale nie zwracają wartości).
Lookaround używane są w sytuacji, gdy mamy wzorzec i jest on poprzedzony innym wzorcem,
lub następuje po nim kolejny wzorzec. Na przykład, chcemy mieć wszystkie
numery, które są poprzedzone znakiem $
w takim łańcuchu $4.44 and $10.88
.
Użyjemy takiego wyrażenia regularnego (?<=\$)[0-9\.]*
które oznacza: znajdź
wszystkie liczby ze znakiem .
poprzedzone znakiem $
. W wyrażeniach regularnych
wyróżniamy:
Symbol | Opis |
---|---|
?= | Lookahead |
?! | Odwrócony lookahead |
?<= | Lookbehind |
?<! | Odwrócony lookbehind |
Lookahead stwierdza, że po pierwszej części wyrażenia musi następować
następne wyrażenie. Zwracane dopasowanie zawiera tylko tekst, który został
dopasowany przez pierwszą część wyrażenia. Stosuje się je w nawiasach wraz
ze znakami zapytania i równości: (?=...)
. Wyrażenie lookahead
wpisuje się po znaku równości. Na przykład wyrażenie (T|t)he(?=\sfat)
oznacza: opcjonalną małą literę t
lub dużą T
, następującą po niej
literę h
, następującą po niej literę e
. W nawiasach definiujemy
wyrażenie lookahead, które mówi aby dopasować The
lub the
i następujące
po nich fat
.
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
Używany jest, gdy potrzebujemy dopasowania z łańcucha, po których nie następują
żadne wzorce. Odwrócony lookahead definiujemy w nawiasach, stosując znak negacji
!
po znaku zapytania, na przykład: (?!...)
. Popatrzmy na następujące wyrażenie
(T|t)he(?!\sfat)
które oznacza: znajdź wszystkie słowa The
lub the
w łańcuchu,
po których nie następuje słowo fat
, poprzedzone spacją.
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
Lookbehind używany jest do odnalezienia wszystkich dopasowań poprzedzonych konkretnym
wzorcem. Wyrażenie lookbehind zapisujemy tak: (?<=...)
. Na przykład, wyrażenie
(?<=(T|t)he\s)(fat|mat)
oznacza: znajdź wszystkie słowa fat
lub mat
w łańcuchu,
które znajdują się po słowach The
lub the
.
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
Odwrócony używany jest do odnalezienia wszystkich dopasowań niepoprzedzonych konkretnym
wzorcem. Odwrócony lookbehind zapisujemy tak: (?<!...)
. Na przykład, wyrażenie
(?<!(T|t)he\s)(cat)
oznacza: znajdź wszystkie słowa cat
w stringu, które nie następują
po słowach The
lub the
.
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
Flagi nazywane są także modyfikatorami, ponieważ zmieniają wynik wyrażenia regularnego. Flagi mogą być używane w każdej kombinacji i są integralną częścią wyrażeń regularnych.
Flaga | Opis |
---|---|
i | Wielkość znaków: Sprawia, że dopasowanie nie jest wrażliwe na wielkość znaków. |
g | Przeszukanie globalne: Wyszukiwanie wzorca w całym łańcuchu. |
m | Multilinia: Sprawia, że kotwice działają na każdej linii. |
Modyfikator i
używany jest, gdy wielkość liter nie ma znaczenia. Na przykład
wyrażenie /The/gi
oznacza: dużą literę T
, następującą po niej literę h
,
następującą po niej literę e
. A na końcu wyrażenia, flaga i
żeby ignorować
wielkość znaków. Jak widać, została też użyta flaga g
ponieważ chcemy przeszukać
cały łańcuch.
"The" => The fat cat sat on the mat.
"/The/gi" => The fat cat sat on the mat.
Modyfikator g
używany jest do przeszukiwania całego łańcucha (znajdź wszystko,
a nie tylko zatrzymuj się na pierwszym). Na przykład wyrażenie /.(at)/g
oznacza: każdy znak z wyjątkiem nowej linii, następującą po nim literę a
,
następującą po niej literę t
. Ponieważ użyliśmy na końcu wyrażenia flagi g
,
wyszukane zostaną wszystkie dopasowania w łańcuchu, a nie tylko pierwszy (domyślne zachowanie).
"/.(at)/" => The fat cat sat on the mat.
"/.(at)/g" => The fat cat sat on the mat.
Modyfikator m
używany jest do dopasowywania w wielu liniach. Jak wspominaliśmy
wcześniej, kotwice (^, $)
używane są do sprawdzania czy wzorzec jest początkiem
lub końcem łańcucha. Jeśli chcemy, żeby kotwice zadziałały w każdej linii, używamy
wtedy flagi m
. Na przykład wyrażenie /at(.)?$/gm
oznacza: małą literę a
,
następującą po niej małą literę t
, opcjonalnie dowolny znak z wyjątkiem nowej linii.
I ponieważ użyliśmy flagi m
dopasowywane będą wzorce na końcu każdej linii w łańcuchu.
"/.at(.)?$/" => The fat cat sat on the mat.
"/.at(.)?$/gm" => The fat cat sat on the mat.
- Zgłaszanie błędów
- Otwieranie pull request z poprawkami
- Dzielenie się poradnikiem
- Skontaktuj się ze mną ziishaned@gmail.com lub
MIT © Zeeshan Ahmad