Czym są regular expressions (regex)?
Regular expressions, często nazywane regex lub regexp, to potężne narzędzie do pracy z tekstem. Są to wzorce opisujące pewien zbiór ciągów znaków. Pomyśl o nich jako o zaawansowanych filtrach, które pozwalają na wyszukiwanie, dopasowywanie, a nawet zamienianie fragmentów tekstu spełniających określone kryteria. Regular expressions to nie tylko teoria, to praktyczne umiejętności wykorzystywane w programowaniu, analizie danych, edycji tekstu i wielu innych dziedzinach.
Regular expressions to język sam w sobie. Używają specjalnych znaków i składni do definiowania wzorców. Na początku mogą wydawać się skomplikowane i tajemnicze, ale z czasem i praktyką staną się niezastąpionym narzędziem w twoim arsenale programistycznym.
Podstawowe elementy składni regex

Zanim zagłębimy się w bardziej zaawansowane techniki, przyjrzyjmy się podstawowym elementom, z których składają się wyrażenia regularne:
- literały: Najprostszy element regex to zwykły znak, np. 'a’, 'b’, '1′, '2′. Wzorzec 'abc’ dopasuje się dokładnie do ciągu znaków 'abc’.
- metaznaki: To specjalne znaki, które mają specjalne znaczenie w regex. Oto kilka najważniejszych:
.(Kropka): dopasowuje dowolny pojedynczy znak (z wyjątkiem znaku nowej linii, chyba że użyjesz odpowiedniej flagi).*(Gwiazdka): dopasowuje zero lub więcej wystąpień poprzedzającego elementu. Na przykład, 'a*’ dopasuje ”, 'a’, 'aa’, 'aaa’ itd.+(Plus): dopasowuje jedno lub więcej wystąpień poprzedzającego elementu. 'a+’ dopasuje 'a’, 'aa’, 'aaa’, ale nie dopasuje ”.?(Znak zapytania): dopasowuje zero lub jedno wystąpienie poprzedzającego elementu. 'a?’ dopasuje ” lub 'a’.[](Nawiasy kwadratowe): definiują klasę znaków. '[abc]’ dopasuje 'a’, 'b’ lub 'c’. '[a-z]’ dopasuje dowolną małą literę alfabetu.^(Daszek): ma dwa znaczenia:- Wewnątrz nawiasów kwadratowych: negacja. '[^abc]’ dopasuje dowolny znak z wyjątkiem 'a’, 'b’ i 'c’.
- Poza nawiasami kwadratowymi: oznacza początek łańcucha znaków. '^abc’ dopasuje tylko te łańcuchy, które zaczynają się od 'abc’.
$(Dolar): oznacza koniec łańcucha znaków. 'abc$’ dopasuje tylko te łańcuchy, które kończą się na 'abc’.\(Backslash): służy do „ucieczki” (escape) metaznaków, czyli traktowania ich jak zwykłych znaków. Jeśli chcesz dopasować kropkę, musisz użyć '\.’.
- kwantyfikatory: Określają, ile razy dany element wzorca ma wystąpić. Poza gwiazdką, plusem i znakiem zapytania, mamy również:
{n}: Dopasowuje dokładnie n wystąpień. 'a{3}’ dopasuje 'aaa’.{n,}: Dopasowuje co najmniej n wystąpień. 'a{3,}’ dopasuje 'aaa’, 'aaaa’, 'aaaaa’ itd.{n,m}: Dopasowuje od n do m wystąpień. 'a{3,5}’ dopasuje 'aaa’, 'aaaa’ i 'aaaaa’.
- grupy: Nawiasy okrągłe
()Służą do grupowania części wzorca. Grupy pozwalają na:- Zastosowanie kwantyfikatorów do całych grup znaków, np. '(ab){2}’ dopasuje 'abab’.
- Zapamiętywanie dopasowanych fragmentów tekstu do późniejszego wykorzystania (tzw. Capturing groups).
- alternatywa: Znak
|(Pipe) oznacza „lub”. 'a|b’ dopasuje 'a’ lub 'b’.
Przykłady użycia regular expressions
Żeby lepiej zrozumieć, jak działają regular expressions, przeanalizujmy kilka praktycznych przykładów:
- sprawdzanie poprawności adresu email:
Bardzo popularne zastosowanie regex. Wzorzec może wyglądać następująco:^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,}$
Ten wzorzec sprawdza, czy adres email składa się z ciągu znaków alfanumerycznych, kropek, podkreśleń, procentów, plusów i minusów, po których następuje znak '@’, następnie ciąg znaków alfanumerycznych i kropek, a na końcu domena składająca się z co najmniej dwóch liter. - wyszukiwanie numerów telefonów:
Inny częsty przypadek użycia. Wzorzec:\d{3}-\d{3}-\d{3}
Ten wzorzec dopasuje numery telefonów w formacie xxx-xxx-xxx, gdzie x to cyfra. - zamiana formatu daty:
Załóżmy, że masz datę w formacie rrrr-mm-dd i chcesz ją zamienić na format dd.mm.rrrr. Możesz to zrobić za pomocą regex i tzw. Capturing groups:- Wzorzec:
(\d{4})-(\d{2})-(\d{2}) - Zamiana:
$3.$2.$1
Tutaj, nawiasy okrągłe tworzą trzy grupy: rok, miesiąc i dzień. Następnie, w części zamiany, odwołujemy się do tych grup za pomocą
$1,$2I$3W odpowiedniej kolejności. - Wzorzec:
- usuwanie białych znaków z początku i końca łańcucha:
Wzorzec:^\s+|\s+$
Ten wzorzec dopasowuje białe znaki (spacje, tabulatory, znaki nowej linii) na początku (^\s+) Lub na końcu (\s+$) Łańcucha.
Regex w różnych językach programowania
Regular expressions są dostępne w większości języków programowania. Implementacje mogą się nieznacznie różnić, ale podstawowe zasady pozostają te same. Oto kilka przykładów:
- python: Python ma wbudowany moduł
re, Który pozwala na pracę z regex. - javascript: Javascript posiada obiekt
regexp, Który umożliwia tworzenie i używanie wyrażeń regularnych. - java: Java udostępnia pakiet
java.util.regex, Który zawiera klasy do obsługi regex. - c#: C# oferuje przestrzeń nazw
system.text.regularexpressions, Która zawiera klasy do pracy z wyrażeniami regularnymi.
Każdy z tych języków ma swoje specyficzne funkcje i metody do wykonywania operacji na regex, takie jak:
- dopasowywanie (matching): Sprawdzanie, czy dany łańcuch znaków pasuje do wzorca.
- wyszukiwanie (searching): Znajdowanie fragmentów łańcucha, które pasują do wzorca.
- zamiana (replacing): Zamienianie fragmentów łańcucha, które pasują do wzorca, na inny tekst.
- dzielenie (splitting): Dzielenie łańcucha na mniejsze części na podstawie wzorca.
Zaawansowane techniki regex
Kiedy opanujesz już podstawy, możesz zacząć eksperymentować z bardziej zaawansowanymi technikami:
- lookarounds (asercje zerowej długości): Pozwalają na dopasowanie wzorca tylko wtedy, gdy jest on poprzedzony lub następuje po nim inny wzorzec, bez włączania tego innego wzorca do dopasowania.
- positive lookahead:
a(?=b)Dopasuje 'a’ tylko wtedy, gdy po nim następuje 'b’. - negative lookahead:
a(?!b)Dopasuje 'a’ tylko wtedy, gdy po nim nie następuje 'b’. - positive lookbehind:
(?<=b)aDopasuje 'a’ tylko wtedy, gdy jest poprzedzone przez 'b’. - negative lookbehind:
(? dopasuje 'a' tylko wtedy, gdy nie jest poprzedzone przez 'b'.
- positive lookahead:
- backreferences (odwołania wsteczne): Pozwalają na odwoływanie się do wcześniej dopasowanych grup. Na przykład,
(.)\1Dopasuje dwa identyczne znaki obok siebie (np. 'aa’, 'bb’). - flagi: Modyfikują zachowanie regex. Najczęściej używane flagi to:
i(Ignore case): ignoruje wielkość liter.g(Global): dopasowuje wszystkie wystąpienia wzorca w łańcuchu, a nie tylko pierwsze.m(Multiline): traktuje łańcuch jako wieloliniowy, dzięki czemu^I$Dopasowują początek i koniec każdej linii, a nie tylko całego łańcucha.s(Dotall): sprawia, że kropka (.) Dopasowuje również znaki nowej linii.
Pułapki i dobre praktyki
Praca z regular expressions może być frustrująca, jeśli nie będziesz ostrożny. Oto kilka pułapek, których należy unikać:
- nadmierna komplikacja: Staraj się pisać proste i czytelne wyrażenia. Zbyt skomplikowane regex mogą być trudne do zrozumienia i utrzymania.
- problemy z wydajnością: Niektóre regex mogą być bardzo kosztowne obliczeniowo, zwłaszcza jeśli są używane na dużych ilościach danych. Unikaj nadmiernego używania alternatywy (
|) I backtrackingu. - niepoprawne escaping: Upewnij się, że poprawnie escapujesz metaznaki, zwłaszcza w różnych językach programowania.
Oto kilka dobrych praktyk, które pomogą ci pisać lepsze wyrażenia regularne:
- testuj swoje regex: Używaj narzędzi online do testowania regex (np. Regex101.com) lub wbudowanych funkcji testowych w swoim języku programowania.
- komentuj swoje regex: Jeśli twój regex jest skomplikowany, dodaj komentarze, które wyjaśniają, co poszczególne części wzorca robią.
- używaj nazwanych grup: Zamiast odwoływać się do grup za pomocą numerów (
$1,$2), Używaj nazwanych grup ((?). To poprawia czytelność kodu....) - korzystaj z bibliotek regex: Wiele bibliotek regex oferuje dodatkowe funkcje i optymalizacje, które mogą ułatwić ci pracę.
Podsumowanie
Regular expressions to potężne narzędzie, które może znacznie ułatwić pracę z tekstem. Choć na początku mogą wydawać się skomplikowane, z czasem i praktyką staną się niezastąpionym elementem twojego warsztatu programistycznego. Pamiętaj o testowaniu, komentowaniu i dbaniu o czytelność swoich wyrażeń. Powodzenia w opanowywaniu regex!


Dodaj komentarz