niedziela, 11 marca 2012

Wyrażenia regularne #1

W kilku postach postaram się opisać najdokładniej i najzwięźlej jak tylko potrafię moc ukrytą w wyrażeniach regularnych.

Teoria
Na początek trochę teorii za Wikipedią:
Wyrażenia regularne (ang. regular expressions, w skrócie regex lub regexp) – wzorce, które opisują łańcuchy symboli. Teoria wyrażeń regularnych jest związana z teorią języków regularnych. Wyrażenia regularne mogą określać zbiór pasujących łańcuchów, mogą również wyszczególniać istotne części łańcucha.

Wyrażenia regularne to w informatyce teoretycznej ciągi znaków pozwalające opisywać języki regularne. W praktyce znalazły bardzo szerokie zastosowanie, pozwalają bowiem w łatwy sposób opisywać wzorce tekstu, natomiast istniejące algorytmy w efektywny sposób określają, czy podany ciąg znaków pasuje do wzorca lub wyszukują w tekście wystąpienia wzorca. Wyrażenia regularne w praktycznych zastosowaniach są zapisywane za pomocą bogatszej i łatwiejszej w użyciu składni niż ta stosowana w rozważaniach teoretycznych.
Gdzie można stosować takie wyrażenia?
http://xkcd.com/208/

Zaczynając od .htaccessa [o którym będzie w innym cyklu], poprzez wyszukiwanie ciągu znaków w skrypcie na przeszukiwaniu projektów kończąc. To oczywiście tylko trzy ogólne przykłady.


Praktyka
Ok, teorię mamy już za sobą, więc najwyższy czas przejść do praktyki. Dzisiaj omówię podstawowe elementy regexów.

Znaki zwykłe
  • wszystkie niespecjalne [o specjalnych trochę niżej] znaki, określają one same siebie; są to wszystkie litery bądź cyfry, oraz kilka innych znaków np:
a h x 8 2 !
  • ciągi znaków niespecjalnych, oznaczające, że znaki muszą wystąpić w tekście w takiej kolejności jak zapisano w wyrażeniu, np:
abc gh yk
Znaki specjalne - znaki o specjalnym przeznaczaniu
  • kropka '.' - dowolny jeden znak, np
do wyrażenia ta.a będzie pasować tata, tama, tara, taka, etc
  • gwiazdka '*' - zero lub więcej wystąpień  poprzedzającego ją wyrażenia.:
f*oobar pasuje: oobar, foobar, fffffffffoobar, etc
k.*ala pasuje kala, koala, kooooala, krala, krrrrala, etc
  • plus '+' - co najmniej jeden element poprzedzający
pa+nda można dopasować: panda, paanda, paaaaaaaanda, etc
  • znak zapytania '?' - zero lub jedno wystąpienie elementu poprzedzającego:
babk?a pasuje zarówno babka jak i baba
  • nawiasy okrągłe '( )' - zapamiętują zawartość nawiasu jako element, służy do grupowania znaków w elementy:
(kot)+ dopasuje do: kot, kotkot, kotkotkot
  • nawiasy kwadratowe '[ ]' - zestawy znaków, bez dodatkowych znaków specjalnych oznaczają jeden znak spośród wymienionych w środku
[0-9] - cyfry
[a-z] - małe litery
[A-Z] - duże litery
[0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ] - wszystkie cyfry, małe oraz duże litery, oraz polskie znaki 
[atm]+ dopasujemy: tama, tata, mata, mama, mam, etc
  • pionowa kreska '|' - alternatywa czyli OR:
k[o|a]?tek dopasujemy ktek, kotek lub katek
  • daszek '^' oznacza początek wiersza, dolar '$' oznacza koniec wiersza
do wyrażenia ^kot dopasujemy kot i pies, ale już nie pies i kot
natomiast do kot$ dopasujemy pies i kot, ale już nie kot i pies
  • daszek '^' wewnątrz [ ] powoduje negację tego, co znajduje się wewnątrz nawiasów
do [^e] dopasujemy wszystkie ciągi nie zawierające litery e, np: koala, miś, etc [tzn etc już nie :P]
Wyświetlanie znaków specjalnych
  • aby wyświetlić znak specjalny należy poprzedzić go backslashem \, dzięki czemu nie będzie on interpretowany jako znak specjalny ale tak samo jak znam zwykły, np:
\\ \. \*
Klasy znaków
  • \w dowolny znak należący do słowa(cyfry, litery oraz znak '_' )
  • \W dowolny znak nie należący do słowa
  • \s dowolny biały znak (np spacja)
  • \S dowolny nie biały znak
  • \d dowolna cyfra
  • \D dowolny znak który nie jest cyfrą
Zbiory definiowanych znaków w PHP
  • [[:alpha:]] - dowolna litera
  • [[:lower:]] - dowolna mała litera
  • [[:upper:]] - dowolna duża litera
  • [[:digit:]] - dowolna cyfra
  • [[:alnum:]] - dowolna litera bądź cyfra
  • [[:punct:]] - dowolny znak interpunkcyjny
  • [[:xdigit:]] - dowolna liczba w systemie szesnastkowym
Symbole formatujące tekst
  • \n - nowa lina
  • \r - powrót karetki
  • \t - tabulacja
  • \a - alarm 
  • \e - escape 

Na dzisiaj chyba wystarczy ;) W następnym 'odcinku' postaram się opisać bardziej zaawansowane sposoby na wykorzystanie tego, czego nauczyliśmy się dzisiaj.

Brak komentarzy:

Prześlij komentarz