Wyrażenia regularne są potężną techniką opisywania wzorców tekstu występujących w plikach tekstowych - wiele programów wykorzystuje tą funkcjonalność. Programy do wyszukiwania takie jak 'grep' opierają się właśnie na tych wyrażeniach. Zasadniczo wyrażenia regularne ukształtowały się w świecie linuxa. Powstało wiele języków skryptowych, takich jak perl, ruby, PHP, JS, etc., które bazują na wyrażeniach regularnych. Wyrażenia regularne są również intensywnie wykorzystywane w module mod_rewrite w Apache'u, który opisałem we wcześniejszych postach. Coraz mniej jest języków, które nie posiadają choćby kilku funkcji wykorzystujących wyrażenia regularne, tak więc bardzo istotną sprawą jest opanowanie tego wielofunkcyjnego narzędzia.
Nie przestrasz się zewnętrznym wyglądem ułożonych wyrażeń regularnych; mnóstwo znaków specjalnych sprawia wrażenia trudnego do opanowania, ale jak już poznasz podstaw to uświadomisz sobie, że łatwiej już chyba nie może być. Przykładowo, za pomocą wzorca [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4} można sprawdzić poprawność wpisanego w formularz adresu e-mail. Poznając podstawy wyrażeń regularnych powyższy zapis stanie się dla Ciebie jasny jak słońce.
Metaznaki:
Wyrażenia regularne mogą składać się ze zwykłych znaków lub z metaznaków. Zwykłe znaki to np. zapis "RegEx is easy", natomiast metaznaki oprócz tego, że wyglądają jak zwykłe znaki, mają dodatkowo pewne zastosowanie merytoryczne. W wyrażeniach regularnych używając zwykłego znaku np. "P", znajdujemy w tekście "P". Jeżeli użyjemy metaznaku, możemy dopasować o wiele więcej szukanych fragmentów.
Wyróżniamy następujące metaznaki:
. + ? * ^ $ [ ( ) \ | {
Słownie te znaki to: kropka, plus, znak zapytania, asterisk, karetka, dolar, nawias kwadratowy otwierający, nawiasy zwykłe, backslash, kreska pionowa (alternatywa), klamra otwierająca.
. - kropka pasuje do dowolnego znaku, a więc wyrażenie r.d pasuje do wyrażeń rod, rad, rid, r$d, r6d, itd.
+ - plus to jedno lub więcej wystąpień wyrażenia poprzedzającego, np. Do+M pasuje do DoM, DooM, DoooM, DooooM, itd.
? - znak zapytania oznacza zero lub jedno wystąpienie poprzedzajacego wyrażenia, a więc np. Do?M pasuje do DM lub DoM.
* - asteriks to zero lub więcej wystąpień wyrażenia poprzedzającego, np. Do*M pasuje do DM, DoM, DooM, DoooM, DooooM, itd.
^ - karetka użyta na początku wyrażenia (przed nawiasami) odpowiada za początek linii, natomiast użyta po nawiasie kwadratowym oznacza zaprzeczenie, np. [^0-9] oznacza wszystkie znaki z wyjątkiem liczb od 0 do 9.
$ - dolar oznacza koniec danego napisu lub po prostu koniec linii
[ ] - nawiasy kwadratowe służą do dopasowywania liter z podanego zbioru, np. [dgj] pasuje do jednej z liter, d, g lub j. [a-z] oznacza wszystkie małe litery od a do z, jednak taki zakres nie obejmuje polskich znaków. Aby określić wszystkie znaki polskiego alfabetu musimy użyć wyrażenia [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
( ) - tzw. atom - umożliwia zastosowanie alternatywy | (or) oraz na dopasowywanie powtarzających się fragmentów ciągów znaków. Przykładowo, do wyrażenia /^(abc)+$/ pasują ciągi "abc", "abcabc", "abcabcabc" itd.
\ - backslash pozwala nam na używanie specjalnych znaków we wzorcu, tak aby były również wyszukiwane a nie traktowane jako metaznak. Tzn. aby znaleźć plik.txt musimy użyć zapisu plik\.txt. Wyrażenie plik.txt potraktowałoby nam kropkę jako metaznak i znalazłoby również wyrażenia takie jak plikitxt, plik1txt, etc.
| - pionowa kreska (ang. pipeline)oznacza alternatywę. Inaczej mówiąc jest to operator logiczny 'OR'. Jeżeli np. napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c.
+ - plus to jedno lub więcej wystąpień wyrażenia poprzedzającego, np. Do+M pasuje do DoM, DooM, DoooM, DooooM, itd.
? - znak zapytania oznacza zero lub jedno wystąpienie poprzedzajacego wyrażenia, a więc np. Do?M pasuje do DM lub DoM.
* - asteriks to zero lub więcej wystąpień wyrażenia poprzedzającego, np. Do*M pasuje do DM, DoM, DooM, DoooM, DooooM, itd.
^ - karetka użyta na początku wyrażenia (przed nawiasami) odpowiada za początek linii, natomiast użyta po nawiasie kwadratowym oznacza zaprzeczenie, np. [^0-9] oznacza wszystkie znaki z wyjątkiem liczb od 0 do 9.
$ - dolar oznacza koniec danego napisu lub po prostu koniec linii
[ ] - nawiasy kwadratowe służą do dopasowywania liter z podanego zbioru, np. [dgj] pasuje do jednej z liter, d, g lub j. [a-z] oznacza wszystkie małe litery od a do z, jednak taki zakres nie obejmuje polskich znaków. Aby określić wszystkie znaki polskiego alfabetu musimy użyć wyrażenia [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
( ) - tzw. atom - umożliwia zastosowanie alternatywy | (or) oraz na dopasowywanie powtarzających się fragmentów ciągów znaków. Przykładowo, do wyrażenia /^(abc)+$/ pasują ciągi "abc", "abcabc", "abcabcabc" itd.
\ - backslash pozwala nam na używanie specjalnych znaków we wzorcu, tak aby były również wyszukiwane a nie traktowane jako metaznak. Tzn. aby znaleźć plik.txt musimy użyć zapisu plik\.txt. Wyrażenie plik.txt potraktowałoby nam kropkę jako metaznak i znalazłoby również wyrażenia takie jak plikitxt, plik1txt, etc.
| - pionowa kreska (ang. pipeline)oznacza alternatywę. Inaczej mówiąc jest to operator logiczny 'OR'. Jeżeli np. napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c.
Najłatwiej jest zrozumieć działanie metaznaków na przykładzie. Załóżmy, że chcemy w pliku tekstowym odnaleźć wszelkie wpisy o treści *.php to nasze wyrażenie regularne będzie miało postać \*\.php a nie *.php, ponieważ * i . to metaznaki i aby były traktowane jako normalny znak musimy użyć backslasha. Z angielskiego nazywa się to escape character, jednak trzeba pamiętać aby używać go tylko przed mataznakami, czyli przed '(', ')', '[', ']', '{', '}', '\', '*', '|', '^', '$', '?' przed zwykłymi znakami powoduje coś zupełnie innego, a mianowicie predefiniowane klasy znakowe. Ale o tym w kolejnym poście.
Brak komentarzy:
Prześlij komentarz