Wyrażenia regularne, które każdy programista znać powinien



Wyrażenia regularne, które każdy programista znać powinien

Wyrażenia regularne są to wzorce opisujące łańcuchy symboli, powszechnie używane w językach programowania, dla przykładu PHP, ASP, Java i wielu wielu innych. Można by powiedzieć ze wyrażenia regularne same w sobie są swego rodzaju pod-językiem, posiadając własną składnie i reguły.

Na pierwszy rzut oka zdają się być niezrozumiałe i nie posiadać większego sensu, ale tak naprawdę, jak pozna się podstawy, wszystko staje się prostsze.

W dzisiejszym artykule przyjrzymy się trochę bliżej składni wyrażeń regularnych, a następnie zaprezentuje przykłady najczęściej wykorzystywanych wzorców wyrażeń regularnych, wraz z objaśnieniami składni w nich występującej

Do czego wykorzystujemy wyrażenia regularne?

Tak naprawdę to jednej rzeczy – do znajdowania zadanego wzorca w tekście. Ale to jedno zastosowanie sprawia że mamy narzędzie do definiowania niemal nieograniczonej liczny reguł, np. do znajdowania zadanego słowa w podanym ciągu znaków, do znajdowania wszystkich słów zaczynających się lub kończących się na jakąś literę lub ciąg znaków, ale to są tylko najprostsze zastosowania wyrażeń regularnych. W praktyce często stanowią one integralną część pisanych programów. Doskonałym tego przykładem jest walidacja formularza, tudzież innych danych pochodzących od użytkownika.

Składnia wyrażeń regularnych

Tak jak wcześniej wspomniałem, wyrażenia regularne niejako można zakwalifikować jako “pod-język”, więc zapoznajmy się teraz ze składnią tego języka:

Wyrażenie regularne Dopasowanie do
test ciągu znaków “test”
^test ciągu znaków zaczynających się od “test”
test$ ciągu znaków kończących się na “test”
^test$ ciągu znaków “test”, ale nie znajdujący się wewnątrz innego ciągu
[abc] a, b, lub c
[a-z] jakakolwiek mała litera
[^A-Z] dowolny znak nie będący dużą literą
(gif|jpg) ciąg znaków “gif” lub “jpg”
[a-z]+ jedna lub więcej małych liter
[0-9] jakakolwiek cyfra
^[a-zA-Z0-9_]{1,}$ słowo składające się z przynajmniej jednej litery, cyfry lub znaku “_”
([A-Z]{3}|[0-9]{4}) 3 wielkie litery lub cztery cyfry

Pozostają jeszcze znaki specjalne.

Znaki specjalne w wyrażeniach regularnych pozwalają wprowadzić logikę we wzorcach, określając np krotność grup dopasowania, czy też wymuszając konkretny typ dopasowania. Aby wykorzystywać literał znaku (jego dosłowne znaczenie), należy przez znakiem specjalnym postawić backslash “\” (i tak, aby wykorzystać backslash dosłownie, to należy wstawić dwa backslashe).

Znak specjalny Znaczenie
. dowolny znak
* zero lub więcej poprzedzających elementów
+ jeden lub więcej poprzedzających elementów
? zero lub jeden poprzedzający element
{min,max} min i max liczba powtórzeń poprzedzającego elementu
\ przywrócenie “zwykłego” znaczenia dla znaków specjalnych
^ początek napisu (użycie na samym początku wzorca)
$ koniec napisu
[...] dowolny element z elementów wewnątrz nawiasu

Na koniec jeszcze lista znaków predefiniowanych

Znaki predefiniowane w wyrażeniach regularnych pełnią rolę zamienników, które można używać zamiennie z grupami znaków. Dodatkowo używa się znaków predefiniowanych do reprezentowania znaków komend – poniższa tabelka wyjaśnia istotę tychże znaków, wyjaśniając ważniejsze z nich.

Znak predefinoiwany Znaczenie
0 NULL
\w znak wyrazu (skrót dla [a-zA-Z0-9_]).
\W negacja znaku wyrazu (skrót dla [^a-zA-Z0-9_]).
\d liczba (skrót dla [0-9])
\D znak inny niż liczba (skrót dla [^0-9])
\n znak nowej linii
\t znak tabulacji
\s dowolny biały znak
\S dowolny inny znak niż biały znak

Oczywiście wyjaśnione powyżej elementy składni wyrażeń regularnych, nie stanowią kompletnej listy atrybutów i reguł, jednakże na potrzeby niniejszego artykułu w zupełności wystarczą.

Wyrażenia regularne w praktyce

Skoro dowiedzieliśmy się już czym są wyrażenia regularne, do czego się ich używa i jaka jest ich podstawowa składnia, czas zerknąć na ich praktyczne zastosowanie w twojej aplikacji. W dalszej części artykułu znajduje się 6 najczęściej wykorzystywanych, praktycznych przykładów wykorzystywania wyrażeń regularnych.

1. Walidacja nazwy użytkownika

Przedstawiony poniżej przykład wyrażenia regularnego wyszukuje ciąg znaków, składającego się z małych liter i/lub cyfr i/lub znaków “_” i “-”, przy czym minimalna liczba znaków w ciągu musi wynosić 3 znaki, a maksymalna 16 znaków.

/^[a-z0-9_-]{3,16}$/

Przykład wykorzystania wyrażenia regularnego do walidacji nazwy użytkownika:

// wartość z formularza
$user = $_POST['user'];  

// funkcja ‘preg_match’ w języku PHP, wyszukuje we wskazanej zmiennej
// wskazanego wzorca wyrażenia regularnego, zwracając true lub false
if(preg_match("/^[a-z0-9_-]{3,16}$/", $user)){
	$message= "Wprowadzona nazwa użytkownika jest poprawna";
}else{
	$message= "Wprowadzona nazwa użytkownika jest niepoprawna";
}

2. Walidacja hasła użytkownika

Wyrażenie regularne sprawdzające wystarczającą siłę hasła jest analogiczne do przykładu pierwszego, z tą jednak różnicą, że minimalna liczba znaków to 6, a maksymalna to 18.

/^[a-z0-9_-]{6,18}$/

3. Walidacja adresu email

Tym razem trochę bardziej skomplikowane wyrażenie.

Od początku: [a-z0-9_\.-] – wszytko zawarte w nawiasach powiązane jest relacją lub, więc pierwszy człon wyrażenia regularnego to: małe litery (a-z) lub cyfry (0-9) lub znali “_”, “.” lub “-”. Warto zauważyć, że przed kropką znajduje się znak “\” (backslash), który jest znakiem escape, czyli wymusza dosłowne potraktowanie znaku specjalnego. W skrócie kropka zostanie potraktowana jako kropka, a nie jak znak specjalny, oznaczający dowolny znak.

Rozszerzając wzór: ([a-z0-9_\.-]+)@([\da-z\.-]+) – znak “+” oznacza jedno lub więcej powtórzeń, a w tym przypadku jedno lub więcej powtórzeń zawartości nawiasu klamrowego, opisanego paragraf wyżej. Następnie musi wystąpić jeden znak “@”, a dalej cyfra (\d) lb mała litera (a-z) lub znak “.” lub “-”, występując raz lub więcej razy.

Kończąc ([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6}) – w dalszej kolejności musi wystąpić kropka i minimum 2, a maksimum 6 małych liter(a-z) lub kropka.

/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/

4. Dopasowanie do adresu URL

Skoro nam tak dobrze poszło, to chodźmy dalej z jeszcze bardziej skomplikowanym wyrażeniem.

W pierwszej kolejności sprawdzane jest czy występuje http:// lub https://. Następnie sprawdzana jest obecność nazwy domeny, składającej się z jednej lub więcej kropki i/lub myślnika i/lub cyfry i/lub litery. W dalszej kolejności powinna wystąpić kropka, a następnie minimum 2, a maksimum 6 liter lub kropka. W kolejnej sekcji ([\/\w \.-]*)” znajduje się opcjonalne dopasowanie do plików lub folderów, gdzie mogą się znaleźć liczby, litery, spacje, myślniki, kropki, podkreślenia i slashe. Ponieważ jest to opcja, krotność tej sekcji jest zero lub więcej (*). Całość zamyka opcjonalne dopasowanie do znaku slash na końcu adresu.

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

5. Dopasowanie do tagu HTML-owego

W pierwszej kolejności dopasowanie jest do znaku “<", a następnie jednej lub więcej litery - co stanowić będzie nazwę tagu (dodatkowo ujecie całości w nawias sprawia, że wzór staje się grupą do której w dalszej części wyrażenia regularnego możemy się odnieść). W dalszej kolejności możliwe jest wystąpienie atrybutów tagu, więc wskazujemy na zero lub więcej wystąpień znaków rożnych od znaku ">“. Dalej może wystąpić dowolna ilość wystąpień dowolnego znaku i zamknięcie tagu. Do napisania wzoru zamknięcia tagu wykorzystany został element grupowania, czyli jeżeli pierwsza grupa dopasowania (o której mówiłem na początku), została znaleziona, za pomocą nawiasu została ona zgrupowana i można się do niej odnieść, w tym przypadku stosując \1. (w przypadku istnienia dwóch grup w jednym wyrażeniu do pierwszej odnosimy się poprzez \1 a do drugiej poprzez \2 itd.). Wracając do tagu zamykającego – jego treść po znaku “<" musi odpowiadać nazwie tagu na początku, co dopasujemy wykorzystując \1 następnie przynajmniej jeden biały znak i znak ">“./p>

/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

6. Dopasowanie do wszystkich znaków, także polskich

I jeszcze mały smaczek na koniec. W przykładach powyżej nie zakładałem wystąpień polskich znaków, ale nie należy zapominać, że nie zawsze takie założenie możemy popełnić, dlatego przedstawiam jeszcze dopasowanie do wszystkich znaków. Jeżeli chcemy wykorzystać ten przykład w poprzednich wystarczy zamienić a-z ,na a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ, wtedy uwzględnimy wielkie i małe litery oraz polską notację.

[0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]

Podsumowanie

Mam nadzieję ze artykuł rzucił trochę światła na temat wrażeń regularnych i pokazał potencjał, który w prosty sposób można wykorzystać w naszych projektach. Oczywiście przykładów zastosowania wyrażeń regularnych można mnożyć i mnożyć, a i te zaprezentowane tutaj można dalej uściślać, np. dla walidacji adresów email można przekopywać się przez dokumenty RFC, by jeszcze skuteczniej filtrować z puli adresów te, które rzeczywiście są dopuszczalne. Z mojej strony natomiast jak najbardziej zachęcam do dalszej eksploracji tematu.

Zapisz się na RSS by dowiadywać się o nowościach w serwisie!Zapisz się na RSS w blog.alchemycode.pl

Related Posts with Thumbnails
Prześlij dalej:
Digg Google Bookmarks reddit Mixx StumbleUpon Technorati Yahoo! Buzz DesignFloat Delicious BlinkList Furl

5 komentarzy do “Wyrażenia regularne, które każdy programista znać powinien”

Jeśli ktoś tego nie zna, to nazwanie go programistą jest słabym żartem.

[...] Wyrażenia regularne, które każdy programista znać powinien Wyrażenia regularne Autor: grzeszy – 7, Maj 2010 Kategoria: Uncategorized Poprzedni: Windows 7 – obsługa dyskietek FD (floppy disk) [...]

commenter

Trochę nieprecyzyjnie opisałeś wyrażenie [^A-Z] – to jest niekoniecznie litera, tylko dowolny znak nie będący dużą literą.

calkiem fajny wpis

Zostaw komentarz:

Imię (wymagane):
Email:
Strona www:
Komentarz (wymagany):
XHTML: W komentarzach możesz korzystać z nastepujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
-