Cze
30
2014

Wyrażenia regularne – niezbędnik programisty

Każdy z nas, mniej lub bardziej doświadczonych programistów z pewnością spotkał się już z wyrażeniami regularnymi (z ang. Regular Expressions). Jeśli jednak nie mieliście okazji się z nimi bliżej zapoznać lub też chcecie usystematyzować swoją wiedzę na temat wyrażeń regularnych, zapraszam do lektury – czeka nas spora dawka wiedzy. A więc zaczynajmy!

Co to jest wyrażenie regularne?

Wyrażenie regularne najprościej rzecz ujmując to jakiś ciąg znaków, który pełni rolę wzorca do którego porównujemy inny, dowolny, stworzony przez nas ciąg. Mechanizm porównywania naszego ciągu do wzorca, zwraca wartość „prawda” lub „fałsz”.

Przykładowe wyrażenie regularne:

1. [A-Z]{3}[0-9]{7}
2. [a-zA-Z]{2,10} [a-zA-Z]{2,25}

Jeśli nie rozumiecie nic w ząb z tych wyrażeń, nie panikujecie i nie wyłączajcie jeszcze przeglądarki. Pozwólcie, że objaśnię literka po literce, cyferka po cyferce i wtedy mam nadzieję, wszystko stanie się dla Was jasne i przejrzyste.

Zastosowanie wyrażeń regularnych

Istnieje wiele zastosowań wyrażeń regularnych, momentami są pomocne i skracają czas pracy nad zadaniem, a nierzadko są niezastąpione, tak więc należałoby znać to istotne zagadnienie. Do czego można używać wyrażeń regularnych? Między innymi do:
  • weryfikacji danych wprowadzonych przez użytkownika ( np. prawidłowość numeru PESEL, NIP czy kodu pocztowego),
  • przepisywania linków – mod_rewrite,
  • wyszukiwania odpowiednich ciągów znakowych
  • …i wiele, wiele innych!

Znaki specjalne i niespecjalne.

Na początku dobrze by było gdybyśmy wiedzieli, że każdy ale to każdy  wzorzec, składa się ze znaków specjalnych i niespecjalnych. Wystarczy tylko wiedzieć, że znaki specjalne to:

( ) [ ] { } ^ $ /. ? + * \ |

a znaki niespecjalne to reszta znaków czyli np.

g 5 % u ć @ 6 ,

Czym one się różnią? Otóż zasada jest trywialna, jeśli chcemy dopasować nasz ciąg do jakiegoś ze znaków specjalnych używamy ‚backslasha’- \  przed wstawieniem każdego znaku specjalnego. W przypadku reszty znaków nie musimy wstawiać backslasha. Nie rozumiesz tego na razie ? Nie przejmuj się, czytaj dalej, a zobaczysz to na przykładzie.

Interpretacja wyrażeń

Weźmy pod lupę pierwsze z przykładowych wyrażeń.

1. [A-Z]{3}[0-9]{7}

Co niektórzy bardziej spostrzegawczy zobaczą, że pierwsze wyrażenie jest wzorcem numeru dowodu osobistego. Zajmijmy się rozłożeniem go na „czynniki pierwsze”. A więc: wzorzec zaczyna się nawiasem kwadratowym,

[ ] – nawiasy kwadratowe tworzą listę znaków, które mają być dopasowane. Każdy znak w tej liście traktowany jest jako pojedynczy znak.

– (myślnik) – tworzy zakres dopasowywanego ciągu

A więc jak możemy już stwierdzić, pierwszy fragment wyrażenia [a-zA-Z], tworzy zakres liter od a do z, i od A do Z (uwaga! wielkość liter ma znaczenie!) – do tego fragmentu wyrażenia możemy dopasować np. Afganistan lub anAKONDA

Drugą częścią tego wyrażenia są znaki: {2,10}. Te nawiasy wąsate określają liczbę poprzedzających ich znaków.

{4} – taki zapis informuje wyrażenie, że przed nawiasami wąsatymi powinno znaleźć się dokładnie 4 znaki,

{,3} – taki zapis informuje wyrażenie, że przed nawiasami wąsatymi powinny znaleźć się  maksymalnie 3 znaki,

{2,} – taki zapis informuje wyrażenie, że przed nawiasami wąsatymi powinny znaleźć się minimalnie 2 znaki,

{2,10} – informuje wyrażenie, że przed nawiasami powinno znaleźć się pomiędzy 2, a 10 znaków.

Kolejny fragment: [0-9] – zakres liczb od 0 do 9 – chyba nie muszę tłumaczyć, już powinieneś to wiedzieć. Tak samo ostatni fragment naszego wyrażenia {7} – przed nawiasami ma się znaleźć dokładnie 7 znaków – w tym przypadku liczb.

Podoba się? To właśnie cała…

…potęga wyrażeń regularnych. Zajmijmy się trochę trudniejszymi przykładami i pokażmy całą siłę, która jest zawarta w tym potężnym narzędziu.

^(https|http):\/\/(www\.)?[a-z0-9-]{1,20}\.[a-z0-9]{2,5}$i

Kolejnym przykładem jest wzorzec adresu URL. Stwórzmy wzorzec, który będzie zaczynał się https lub http, będzie po tym następować dwukropek :  i część zależna czyli dwa forward slashe //. Następnie będzie fragment z WWW i z kropką – jednak będzie nieobowiązkowy w naszym wzorcu. Kolejnym ciągiem będzie dowolna liczba bądź cyfra, kropka oraz nazwa domeny min 2 i max 5 znaków.

^ – oznacza początek ciągu – czyli np. ^staw dopasuje słowo „stawy” ale już nie dopasuje słowa „zastawnik”

( ) – nawiasy w ciągu oznaczają grupę znaków, w naszym przypadku dwa ciągi oddzielone są pionową linią, o co chodzi?

| – pionowa linia oznacza alternatywę czyli dopasowuje jeden ciąg znaków z min. dwóch ciągów stojących obok pionowej linii. W naszym przypadku wybierany jest wyraz https lub http

Kolejnym fragmentem wyrażenia jest dwukropek : oraz coś takiego: \/\/ – jest to kombinacja forward i back slashy. Otóż, na początku mówiłem, że jeśli chcemy użyć jakiegoś znaku specjalnego musimy poprzedzić go backslashem. I tak też robimy. W tym przypadku ciąg będzie dopasowany jeśli podamy dwa forward slashe.

Po forward slashach następuje wyrażenie w nawiasie a mianowicie (www\.) z pytajnikiem – ?. Ten pytajnik pełni tutaj bardzo ważną rolę. Nie chcemy dopasować pytajnika do naszego URL-a bo jest on niepotrzebny. W tym miejscu zaznaczamy w wyrażeniu regularnym aby znak bądź grupa znaków (jak w naszym przypadku) występowała opcjonalnie tzn. (może wystąpić 0 lub 1 raz);

Następną częścią wyrażenie regularnego to lista znaków dozwolona w ciągu. Warto zwrócić uwagę, na myślnik na końcu tej listy. Jest to znak specjalny, który jest wyjątkiem spośród znaków specjalnych gdyż używając go w liście znaków (przypominam w nawiasach w kwadratowych) nie musimy pisać backslasha jak w przypadku innych znaków specjalnych.

Właśnie to o czym napisałem przed chwilą zawarte jest w kolejnej części tego wyrażenia. Następuje znak backslasha i kropki. Kropka to znak specjalny, a że chcemy by nasz ciąg był dopasowany do kropki – musimy użyć backslasha.

Kolejnym fragmentem tego przydługawego wyrażenie regularnego jest tak naprawdę to sama lista co wcześniej. W tym miejscu określamy możliwe znaki, które będziemy dopasowywać do domeny np. .pl lub .com.

Przedostatnim znakiem jest znak dolara $ – w wyrażeniach regularnych występuje jako koniec ciągu. To właśnie tym znakiem określamy zakończenie wzorca. Po nim mogą wystąpić jedynie pojedyncze litery, które definiują zasady danego wyrażenia np. tak jak w naszym przypadku: i – pozwala na stosowanie zarówno małych jak i dużych liter w ciągu.

Inne ważne definicje  znaków w wyrażeniach regularnych:

\d – jedna cyfra – np. 2,5,1,9 itd.,

\D – dowolny znak niebędący cyfrą np. %, G, a, itd.,

\w – dowolny znak alfanumeryczny np. 2,a,5,b,p itd.,

\W – wszystkie znaki oprócz znaków alfanumerycznych np. %,& itd.,

\s – do podanego ciągu dopasowuje znak spacji,

\S – przeciwieństwo powyższego, dopasowuje wszystko oprócz spacji,

+ – poprzedzający element musi wystąpić co najmniej jeden raz

* – poprzedzający element może wystąpić 0 razy lub więcej

. – zastępuje jeden dowolny znak np. w.r dopasuje wór, wir ale nie dopasuje już np. wichura.

[^(dowolne znaki)] – znak daszka w liście znaków dopasowuje wszystkie znaki oprócz tych podanych w liście (przeciwieństwo)

Przykładowy skrypt w Javascripcie

Specjalnie na potrzeby tego poradnika przygotowałem dla Was tester wyrażeń regularnych. Wystarczy, że pod zmienną regexp podstawicie swój wzorzec, a następnie w inpucie przetestujecie interesujący Was ciąg.

$(document).ready(function(){



 

Uff… To już koniec!

Jeśli dotarłeś do tego akapitu, to ogromny szacun. Super, że chciało Ci się przeczytać moje wypociny. Jednakże jestem przekonany, że jeśli przeczytałeś powyższy artykuł ze zrozumieniem i starałeś się zapamiętać część informacji to udało Ci się  opanować wyrażenia regularne przynajmniej na poziomie podstawowym. Praktyka czyni mistrza, a więc do dzieła! Odpalaj kompilator i stwórz swoje własne wzorce i dopasowuj ciągi znaków. Uważasz, że coś pominąłem albo popełniłem błąd czy zrobiłem literówkę? Będę dłużny jeżeli zostawisz komentarz 🙂

W celu poszerzenia swojej wiedzy teoretycznej i nie tylko, odsyłam do oficjalnej dokumentacji.

 

 

Powiązane wpisy

Autor wpisu:

Jakub Kądzielawa - młodszy programista PHP, student Informatyki, który łączy pracę ze swoją pasją. Czasami narzeka na brak wolnego czasu.

1 komentarz+ Dodaj komentarz

  • Zabrakło: ? – poprzedzający element może wystąpić 0 razy lub 1 raz 😛

Zostaw komentarz