learn-regex


Learn Regex

Tłumaczenia:

Co to jest wyrażenie regularne?

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:



Wyrażenie regularne

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.

Spis treści

1. Najprostsze wyrażenie

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.

Przetestuj wyrażenie

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.

Przetestuj wyrażenie

2. Metaznaki

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.

2.1 Kropka

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.

Przetestuj wyrażenie

2.2 Zestaw znaków

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.

Przetestuj wyrażenie

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.

Przetestuj wyrażenie

2.2.1 Odwrócony zestaw znaków

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.

Przetestuj wyrażenie

2.3 Powtórzenia

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.

2.3.1 Gwiazdka

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.

Przetestuj wyrażenie

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.

Przetestuj wyrażenie

2.3.2 Plus

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.

Przetestuj wyrażenie

2.3.3 Znak zapytania

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.

Przetestuj wyrażenie

"[T]?he" => The car is parked in the garage.

Przetestuj wyrażenie

2.4 Klamry

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.

Przetestuj wyrażenie

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.

Przetestuj wyrażenie

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

Przetestuj wyrażenie

2.5 Grupa znaków

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.

Przetestuj wyrażenie

2.6 Alternatywa

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.

Przetestuj wyrażenie

2.7 Znak ucieczki

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.

Przetestuj wyrażenie

2.8 Kotwice

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.

2.8.1 Kareta

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.

Przetestuj wyrażenie

"^(T|t)he" => The car is parked in the garage.

Przetestuj wyrażenie

2.8.2 Dolar

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.

Przetestuj wyrażenie

"(at\.)$" => The fat cat. sat. on the mat.

Przetestuj wyrażenie

3. Skróty

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]

4. Lookaround

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

4.1 Lookahead

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.

Przetestuj wyrażenie

4.2 Odwrócony lookahead

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.

Przetestuj wyrażenie

4.3 Lookbehind

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.

Przetestuj wyrażenie

4.4 Odwrócony lookbehind

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.

Przetestuj wyrażenie

5. Flagi

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.

5.1 Wielkość znaków

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.

Przetestuj wyrażenie

"/The/gi" => The fat cat sat on the mat.

Przetestuj wyrażenie

5.2 Przeszukiwanie globalne

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.

Przetestuj wyrażenie

"/.(at)/g" => The fat cat sat on the mat.

Przetestuj wyrażenie

5.3 Multilinia

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.

Przetestuj wyrażenie

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

Przetestuj wyrażenie

Kontrybucja

Licencja

MIT © Zeeshan Ahmad