Wyrażenia regularne cz. 1


 
Każdy kto kiedykolwiek będzie miał styczność z programowaniem, prędzej czy później musi spotkać się z wyrażeniami regularnymi. Wyrażenia regularne mimo, że nie wyglądają zbyt przyjaźnie na pierwszy rzut oka i często na początku zniechęcają swoją składnią, są jednym z najbardziej użytecznych narzędzi w pracy z kodem.
 

^(([a-zA-Z0-9]?)([A-Z]{0,12})(\d)){6,12}$

Czy ten ciąg znaków wygląda czytelnie? :)

W 1951 roku, amerykański matematyk Stephen Cole Kleene zaproponował i opisał schemat języka programowania do wyszukiwania dowolnego ciągu znaków. Od tamtego czasu wyrażenia regularne zostały zaadaptowane na potrzeby większości języków programowania.

Z regexów możemy korzystać w kodzie źródłowym, na przykład do walidowania inputów tekstowych czy do porządkowania parsowanego pliku tekstowego.

Są także wbudowane w edytory tekstu co znacznie ułatwia pracę programistów.

Dzięki wyrażeniom regularnym za pomocą ustandaryzowanych znaków specjalnych tworzymy wzorzec tekstu aby później sprawdzić czy występuje on w badanym kodzie.

W przykładach będę posługiwał się językiem JavaScript oraz wbudowanych do niego metod pozwalających na użycie regexów.

 
Podstawy

W języku JavaScript metoda RegExp.prototype.test();
testuje czy w podanym przez nas obiekcie string występuje założone przez nas wyrażenie i zwraca odpowiednio true lub false.

W poniższym przykładzie zadeklarowałem zmienną testString a następnie przetestowałem nią kawałek tekstu. Spróbujcie zmienić regexa lub tekst w teście na niepasujący do siebie. W takim wypadku uzyskamy false.



Składnie wyrażenie regularnego musimy zacząć od slasha. Następnie podaję ciąg znaków i całe wyrażenie zamykam kolejnym slashem.
Po to by na początku uzyskać true jako zmienną z regexem zadeklarowałem /est/.

Powiedzmy, że chciałbym być pewien, że testowany ciąg znaków brzmi DOKŁADNIE tak jak wyrażenie regularne.
Tutaj z pomocą przychodzi nam symbol ^ na początku wyrażenia oraz $ na jego końcu:



Jeśli skasujemy część “ or not to be” z testowanego tekstu otrzymamy true.
Znak ^ sprawdza czy badany tekst zaczyna się tak jak początek regexa. Znak $ natomiast sprawdza końcowe znaki w tekście. Jeśli użyjemy ich obu w jednym wyrażeniu regularnym zbadamy czy tekst brzmi dokładnie tak samo jak znaki pomiędzy ^ oraz $.

Po usunięciu $ z końca regexa również otrzymamy true ponieważ nasze testowane zdanie zaczyna się od To be.

 
String.replace oraz flagi

Posłużmy się ciekawszą metodą String.prototype.replace().



Jak pewnie zauważyliście replace zmieniło słowa z regexa na podane słowo w drugim parametrze metody replace.
W powyższym przykładzie użyliśmy tak zwanych flag czyli literek g oraz i po slashu.

g oznacza, że regex ma zostać zastosowany dla całego tekstu (inaczej zmieniłby się tylko pierwszy napotkany yellow).

i oznacza brak case sensitivity czyli regex może być zastosowany zarówno do wielkich jak i małych liter bez znaczenia.

Idźmy dalej.

 
Znaki specjalne

Załóżmy, że chcielibyśmy przetestować poprawność kodu pocztowego w inpucie z formularza.
Polskie kody pocztowe składają się z 2 i 3 cyfr rozdzielonych myślnikiem.
Z pomocą przychodzą nam tutaj najpierw znaki specjalne.
Przy użycie backslasha i małe literki d odnosimy się do pojedynczej cyfry (digit).



W regexie mamy po kolei najpierw 2 cyfry (\d\d) następnie myślnik (-) oraz kolejne 3 cyfry (\d\d\d).
Możemy jednak uprościć ten zapis korzystając z pierwszego rodzaju kwantyfikatorów.

Jeśli po danym wyrażeniu napiszemy {2} będzie to oznaczało, że dane wyrażenie musi powtórzyć się 2 razy żeby zwrócić true.
Jeśli chcielibyśmy żeby wyrażenie powtórzyło się od 2 do 7 razy – {2,7}.
Powyżej 5 razy? – {5,}.

Zmieńmy naszego regexa:


Zauważcie że jeśli po wpisanej liczbie 456 wpiszecie więcej cyfr skrypt również zwróci true. Dzieje się tak dlatego że nie użyliśmy ^ oraz $ do ograniczenia długości walidacji. Regex trafia w 3 cyfry po myślniku i kończy działanie. Reszta, mimo że jest kontynuacją naszego tekstu już go nie interesuje.

Spróbujcie wpisać więcej cyfr do zmiennej testString oraz ^ i $ do regexa na początku i końcu tak jak we wcześniejszej części artykułu.
Czy uda wam się zwrócić false?

Posłużymy się jeszcze innym kwantyfikatorem.

Znak ? oznacza, że dana cześć regexa może pojawić się 0 lub 1 raz.
Co to oznacza w praktyce? Zobaczcie na przykład:

Założyłem, że w naszym testowanym stringu myślnik może pojawić się 0 lub 1 raz.

Dla pierwszego testu z 1 myślnikiem: true.
Dla drugiego testu bez myślnika (0 razy): true.
W trzecim przykładzie gdzie pojawił się myślnik obok myślnika: false.
 
 
Zestawy znaków

Używając nawiasów kwadratowych w wyrażeniu regularnym, sprawdzamy czy którykolwiek znak z nawiasu pojawi się w badanym stringu.

Jeśli regex wyglądałby tak: /[abc]/ metoda test zwróci nam true jeśli napotka na a, b lub c.

Możemy użyć również zakresów znaków.
[a-z] znajdzie dowolną małą literę z alfabetu, [A-Z] dowolną wielką a [0-9] dowolną cyfrę.

Zestawy możemy oczywiście łączyć z kwantyfikatorami.
[A-Z]{0,12} oznaczać będzie, że dany tekstu musi posiadać od 0 do 12 wielkich liter z zakresu a do z.
 
 
Proste, prawda?

Na początku artykułu przytoczyłem przykład regexa. Dla mnie taki regex na samym początku przygody z wyrażeniami regularnymi był przerażający. Czy słusznie?

^(([a-zA-Z0-9]?)([A-Z]{0,12})(\d)){6,12}$

Wykorzystajmy zdobytą w tym artykule wiedzę i zobaczmy co autor tego wyrażenia miał na myśli.

Pomińmy na początku znaki ^ i $.

[a-zA-Z0-9]? – oznacza jak już pewnie wiecie, że aby zwrócić true musimy trafić na literę od a do z, małą lub wielką lub na cyfrę w przedziale 0-9. Pytajnik na końcu oznacza, że takie wyrażenie musi wystąpić dokładnie 0 lub 1 raz.

[A-Z]{0,12} – oznacza zakres od a do z wyłącznie wielkich liter. Musi być ich co najmniej 0 a maksymalnie 12.

\d – po tym wszystkim musi wystąpić jedna cyfra.

Zauważcie, że każde z tych wyrażeń jest w okrągłych nawiasach. Pełnią one dwojaką funkcję. Po pierwsze oddzielają konkretne części wyrażenia oraz powodują zapamiętanie części wyrażenia regularnego (ale o tym kiedy indziej :)).

Na końcu nasze 3 zestawy są również zamknięte nawiasem okrągłym a znaki {6,12} oznaczają, że całe to wyrażenie musi powtórzyć się co najmniej 6 a maksymalnie 12 razy.

Nasze poznane wcześniej ^ oraz $ oznaczają, że cały badany string musi mieć taką formę jak wrażenie. Nic mniej. Nic więcej

Przetestujmy to!

Ponieważ pierwsza (? – 0 lub 1 raz) i druga ({0,12}) część wyrażenia może powtórzyć się 0 razy do uzyskania true potrzebujemy co najmniej sześciu ({6,12}) cyfr (\d).

Poniżej 6 cyfr skrypt zwróci false (spróbujcie z 01234).
 
 
Łamigłówka 1 :) Dla ilu maksymalnie cyfr wpisanych w testString skrypt będzie zwracał true?

Odpowiedź:

24

 
 
Dlaczego?
Każde wyrażenie może mieć jedną cyfrę z wyrażenia [a-zA-Z0-9]? oraz musi mieć drugą cyfrę z wyrażenia \d co po pomnożeniu przez maksymalny zakres z {6,12} daje nam 24 cyfry.
 
 
Łamigłówka 2.
Wiemy, że minimalna ilość znaków dla zwrócenia true to 6 cyfr.
A ile możemy mieć maksymalnie wszystkich znaków w zmiennej testString?

Odpowiedź:

168

 
 
What next?

W powyższym artykule tylko delikatnie udało mi się rozpocząć złożony temat wyrażeń regularnych. Jak widzicie można dzięki nim testować części tekstu, zamieniać tekst oraz robić wiele innych przydatnych rzeczy dla których dziś nie starczyło mi miejsca.

Gdzie może się to przydać? Wszelka walidacja formularzy kontaktowych, poprawności danych, maili, numerów telefonów, adresów mailowych, linków url…

cdn.

Piotr Bartnik
Front-End Developer

@piotr.bartnik

SALESmanago o platforma Customer Engagement, zaprojektowana dla efektywnych i głodnych sukcesu zespołów marketingowych w eCommerce. Dla marketerów, którzy pragną być zaufanymi partnerami dla swoich CEO. Z naszego rozwiązania korzysta ponad 2000 biznesów online średniej wielkości w 50 krajach oraz liczne globalne marki takie jak Starbucks, Vodafone, Lacoste, New Balance czy Victoria's Secret.

SALESmanago zapewnia maksymalizację wzrostu przychodów oraz poprawy wskaźników KPI dla eCommerce wykorzystując trzy zasady: (1) Customer Intimacy, aby stworzyć autentyczne relacje z klientami w oparciu o dane Zero- i First-Party, (2) Precision Execution, aby zapewnić doskonałe omnichannelowe doświadczenie klienta dzięki hiper-personalizacji oraz (3) Growth Intelligence, która łączy wskazówki opracowane przez specjalistów oraz AI, umożliwiając pragmatyczne i szybkie podejmowanie decyzji w celu maksymalizacji efektu.

Czytaj więcej na: www.salesmanago.pl

Skuteczna personalizacja SALESmanago zwiększa przychody z e-commerce
Skuteczna personalizacja SALESmanago zwiększa przychody z e-commerce

    Nowe inteligentne narzędzie powstało z potrzeby większej personalizacji, dzięki której zespoły e-commerce mogłyby tworzyć indywidualne doświadczenia klientów Jak pokazują wyniki z okresu wyprzedaży Black Friday, stosowanie technik personalizacji przyniosło sprzedawcom 19% więcej interakcji   Kraków, 15 stycznia 2025 r.:  SALESmanago – czołowa europejska platforma zarządzania zaangażowaniem klientów obsługująca ponad 3 tys. klientów – […]

SALESmanago nawiązuje współpracę z PrestaShop, aby rozszerzyć swoją ofertę inteligentnych rozwiązań na sektor eCommerce w Europie
SALESmanago nawiązuje współpracę z PrestaShop, aby rozszerzyć swoją ofertę inteligentnych rozwiązań na sektor eCommerce w Europie

    Współpraca stanowi kolejny krok – po niedawnym przejęciu Leadoo – w rozwoju platformy zarządzania zaangażowaniem klientów w Europie.   Kraków, 18 grudnia 2024 r.: SALESmanago, lider segmentu SaaS obsługujący ponad 3 tys. klientów, nawiązał strategiczną współpracę z PrestaShop – jedną z najpopularniejszych platform eCommerce w Europie, która wspiera ponad 300 tys. firm w […]

Skuteczne zarządzanie w erze „growth hackingu”
Skuteczne zarządzanie w erze „growth hackingu”

    W dzisiejszym jakże zmiennym cyfrowym świecie rola dyrektora generalnego znacząco ewoluowała.   Obecnie fundamentem pomyślnego rozwoju firmy na poszczególnych etapach stała się koncepcja „growth hackingu”. Przy czym nie chodzi już tylko o przetrwanie, ale też o to, by wyprzedzić konkurencję w warunkach, które wymagają od nas zwinnego działania i innowacyjności.   Rzecz jasna, na początku nasz cel […]

SALESmanago przejmuje Leadoo: powstaje największa w Europie platforma do zarządzania zaangażowaniem klientów
SALESmanago przejmuje Leadoo: powstaje największa w Europie platforma do zarządzania zaangażowaniem klientów

    Połączenie zaawansowanych narzędzi konwersji Leadoo z kompleksową platformą Customer Engagement SALESmanago Rozszerzona obecność w kluczowych regionach Europy: kraje nordyckie, Wielka Brytania, Benelux oraz Europa Środkowa, Wschodnia i Południowa   Kraków/Helsinki, 26 listopada 2024 – Ważna fuzja w sektorze e-commerce. SALESmanago, wiodąca platforma Customer Engagement (CEP) z siedzibą w Krakowie, ogłasza przejęcie fińskiej platformy […]

Nie czekaj: Dlaczego IV kwartał to idealny moment na pomnożenie efektów działań marketingowych dzięki SALESmanago
Nie czekaj: Dlaczego IV kwartał to idealny moment na pomnożenie efektów działań marketingowych dzięki SALESmanago

    Wkraczając w burzliwy, jak co roku, czwarty kwartał, wiele firm znajduje się sytuacji paradoksalnej. To najbardziej owocny okres w roku, obiecujący najwyższy ruch i sprzedaż, a jednocześnie właśnie wtedy wiele firm unika wdrażania nowych technologii marketingowych. W SALESmanago rozumiemy przyczyny tej wstrzemięźliwości, ale jesteśmy tutaj, aby rzucić wyzwanie mentalności „poczekaj do czwartego kwartału”. […]

Strategie, które powinien znać prezes każdej firmy e-commerce w erze „Growth Hackingu”
Strategie, które powinien znać prezes każdej firmy e-commerce w erze „Growth Hackingu”

    Autor: Brian Plackis Cheng, dyrektor generalny SALESmanago   Rozwój firmy w dzisiejszym i jakże zmiennym cyfrowym świecie to nie lada wyzwanie. Rola dyrektora generalnego ewoluowała – dziś fundamentem pomyślnego rozwoju firmy na poszczególnych etapach stała się koncepcja „growth hackingu”. Nie chodzi już tylko o przetrwanie, ale też o to, by wyprzedzić konkurencję w […]

eCommerce na przemian rozkwita i popada w stagnację
eCommerce na przemian rozkwita i popada w stagnację

    eCommerce jest kapryśny; popada w stagnację, po czym nagle rozkwita. Ścieżki klientów są nieliniowe. To wiemy na pewno. Bez użytecznych danych klientów i spersonalizowanych ścieżek zakupowych firmy eCommerce tracą prospekty i klientów, doprowadzają swoją markę do stagnacji i trwonią swoją przewagę konkurencyjną.   Korzystanie z danych zero-party i zaawansowanej analityki nie jest już […]

Focus Garden rozkwita z SALESmanago
Focus Garden rozkwita z SALESmanago

    Focus Garden, to lider w branży artykułów ogrodniczych, a ich sukces to opowieść o mocy skutecznego wykorzystania automatyzacji marketingu i strategicznego partnerstwa z SALESmanago.   W ciągu zaledwie roku, nasza współpraca z Focus Garden przyniosła zdumiewające rezultaty:   Imponujący zwrot z inwestycji (ROI) – 6108%  134-procentowy wzrost całkowitej sprzedaży i znaczący wzrost liczby […]

SALESmanago ogłasza zmiany na kluczowych stanowiskach: Nowy CEO i CRO
SALESmanago ogłasza zmiany na kluczowych stanowiskach: Nowy CEO i CRO

    SALESmanago, wiodąca platforma CDP i Marketing Automation, z entuzjazmem informuje o istotnych zmianach w swoim zespole kierowniczym. Zmiany mają na celu optymalizację procesu dostarczania rozwiązań dla segmentu średnich przedsiębiorstw.    Po 13 latach kierowania rozwojem firmy w roli Dyrektora Generalnego, współzałożyciel SALESmanago, Grzegorz Błażewicz, obejmuje nieoperacyjną rolę członka Rady Nadzorczej. Będzie tam odpowiadał […]

30 trików i porad dotyczących korzystania z szablonów e-mail, które zostawią konkurencję w tyle.
30 trików i porad dotyczących korzystania z szablonów e-mail, które zostawią konkurencję w tyle.

    Jak prześcignąć konkurencję eCommerce za pomocą czegoś tak prostego jak szablony wiadomości e-mail? Chcemy czy nie, email marketing pozostaje potężnym narzędziem do angażowania klientów, zwiększania sprzedaży i ostatecznie – wyprzedzania konkurencji. Dzięki odpowiednim strategiom i dobrze opracowanym szablonom e-mailowym można skutecznie komunikować się z odbiorcami, budować trwałe relacje i zwiększać zyski.   Poniżej […]