poniedziałek, 19 lipca 2010

Wyrażenia regularne w Perlu

1. Prolog

Witam! Zacząłem się uczyć Perla i wyznam ze wyrażenia regularne sprawiły mi najwięcej kłopotu więc postanowiłem zebrać to co najważniejsze na ten temat do kupy żeby innym było łatwiej i podać przykłady.

2. Wyrażenia regularne

Wyrażenia regularne są to ogólnie rzecz biorąc wzorce które mają zostać dopasowane do danego łańcucha za pomocą określonych w nich samych reguł.

3. Część główna

Tak jak powiedziałem w Prolog zawarłem w tej częście najważniejsze informacje ze świata wyrażeń regularnych. Oczywiście jest to tylko namiastka tego co tak naprawdę da się robić za pomocą wyrażeń regularnych. Łączac to wszystko poniżej można budować naprawdę potężne narzędzia i dodawać nowe ciekawe funkcje do innego oprogramowania.

- ., reprezentuje jeden znak za wyjątkiem \n,

Przykład:

$_ = "string";

# Dopasuj do lancucha ktory ma jakis znak pomiedzy "str" a "ng"

if (/str.ng/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- *, oznacza dopasowanie poprzedniego elementu zero lub więcej razy,

Przykład:

$_ = "strng";

# Dopasuj jezeli pomiedzy "str" a "ng" wystepuje "i" raz, wiecej razy lub
# wcale

if (/stri*ng/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- +, oznacza dopasowanie poprzedniego elementu raz lub więcej razy,

Przykład:

$_ = "striiiiiiiiiiiiiing";

if (/stri+ng/) {
  print "Correct!\n";
} else
  print "Incorrect!\n";
}

- ?, oznacza dopasowanie poprzedniego elementu raz lub wcale,

$_ = "striiiiiiiiing";

if (/stri?ng/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- [], w nawiasach tych określa się klasę znaków,

$_ = "Mam 23 psy ktore mowia: Hauuu, hauuu";

# Dopasuj jezeli pomiedzy "Mam" a "psy" wystepuje jakas liczba od 0 do 9
# lub wiecej liczb, jezeli za "mowia:" wystepuje wyraz ktorego poczatkowa
# litera zawiera sie w przedziala od A do Z a reszta to "auuu" i jezeli
# za tym wyrazem wystepuje wyraz który pomiedzy "h" a "uuu" ma litere ktora
# zawiera sie w przedziale od a do c

if (/Mam [0-9]+ psy ktore mowia: [A-Z]auuu, h[a-c]uuu/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- ^, powoduje negację klasy znaków przed którą się znajduje, jeżeli chcemy zanegować jakąś klasę która ma swój skrót wystarczy zamiast małej litery wpisać dużą,

Przykład:

$_ = "Mam 23 psy ktore mowia: Hauuu, hauuu!";

# Dopasuj jezeli poczatkowa litera danego wzorca nie zawiera sie w
# przedziale od A do D

if (/[^A-D]am 23 psy ktore mowia: Hauuu, hauuu!/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- \d, skrót klasy znaków oznaczający liczby od 0 do 9, przeciwieństwem jest
\D,

Przykład:

$_ = "Mam dwadziescia psow i 2 koty";

# Dopasuj jezeli pomiedzy "Mam" a "psow" nie wystepuje jedna lub więcej
# liczb z przedziału od 0 do 9 i jezeli pomiedzy "i" a "koty" wystepuje
# liczba od 0 do 9,

if (/Mam \D+ psow i \d koty/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- \w, znak słowny, skrót klasy znaków oznaczający liczby od 0 do 9, litery od a do z i od A do Z a także znak podkreślenia,

Przykład:

$_ = "mam 22 psy _";

# Dopasuj jezeli w danym lancuchu znajduje sie jeden lub wiecej wyrazow

if (/\w+/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- \s, skrót klasy znaków niewidocznych czyli \f (wysunięcie strony), \t (tabulacji), \n (nowej strony), \r (powrotu karetki) oraz spacji,

Przykład:

$_ = "Lubie przechodzic do nowej strony\n";

# Dopasuj jezeli w danym lancuchu znajduja sie jakies wyrazy i po nich
# znak niewidoczny

if (/\w+\s/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- /i, modyfikator który umożliwia dopasowanie bez względu na wielkość liter,

Przykład:

$_ = "Pisze malymi i DUZYMI literami";

if (/pisze malymi i duzymi literami/i) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- /s, modyfikator umożliwiający dopasowanie dowolnego znaku, zmienia znaczenie kropki na takie że kropka oznacza każdy znak włącznie ze znakiem nowego wiersza,

Przykład:

$_ = "nowy wiersz\n";

if (/\w+./s) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- /x, modyfikator który pozwala na dodawanie odstępów i komentarzy we wzorcu,

Przykład:

$_ = "Seprob jest na 3. miejscu sposrod koderow Perla\n";

if (/
  \w+ # dowolna ilosc slow
  /x) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- ^, w kontekście kotwicy oznacza początek łańcucha,

Przykład:

$_ = "Seprob jest na poczatku";

# Dopasuj do lancucha ktory na poczatku ma wyraz "Seprob"

if (/^Seprob/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- $, kotwica końca łańcucha,

$_ = "Na koncu jest seprob";

# Dopasuj do lancucha ktory na koncu na wyraz "rob"

if (/rob$/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- \b, kotwica która dopasowuje tylko do całych wyrazow, przeciwieństwem
jest kotwica \B,

Przykład:

$_ = "Dopasowanie";

# Dopasuj do lancucha ktory ma wyraz "sowanie"

if (/\bsowanie/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- =~, operator dowiązania który dopasowuje łancuch po lewej stronie do wzorca po prawej stronie,

Przykład:

$string = "lancuch";

if ($string =~ /lancuch/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- zmienne dopasowane: wzorzec umieszczony w nawiasie nakazuje zapamiętać dopasowany łańcuch. Pierwszy i kolejne są zapamietywane w zmiennych $1, $2, itd. Automatyczne zmienne dopasowane sa to trzy zmienne o nazwach: $&, $` i $', ktore odpowiednio zachowują w sobie łancuch dopasowany, to co nie zostało dopasowane przed łańcuchem oraz to co nie zostało dopasowane za łańcuchem,

Przykład:

$_ = "przed dopasowane za";

# Dopasuj za pomoca danego wzorca i zapamietaj lancuch ktory zostal
# dopasowany za pomoca wzorca w nawiasach

if (\w+ (\w+) [a-z]a/) {
  print "Przed dopasowaniem: $`\n";
  print "Dopasowane: $1\n";
  print "Po dopasowaniu: $'\n";
} else {
  print "Incorrect!\n";
}

- kwantyfikatory w nawiasach klamrowych oznaczają dopasowanie o określoną liczbę powtórzeń poprzedniego znaku, pierwsza część wzorca umieszczonego w nawiasach klamrowych oznacza minimalną liczbę powtórzeń zaś druga maksymalną, jeżeli nie podano jakiejś części to nie jest ona określona,

Przykład:

$_ = "Krowki robia muuuu, kotki robia miaaaaau, kozy robia meeeee";

if (/Krowki robia mu{1,4}, kotki robia mia{2,}u, kozy robia me{0,5}/) {
  print "Correct!\n";
} else {
  print "Incorrect!\n";
}

- s///, operator który działa jako znajdĽ wzorzec i zastąp go danym
łańcuchem,

$_ = "Seprob jest slaby w Perlu";

# Znajdz w lancuchu "slaby" i zastap go "dobry"

s/slaby/dobry/;

print "$_\n";

- /g, modyfikator który w połączeniu z operatorem s/// nakazuje zamienić wszystkie łańcuchy które zostały dopasowane a nie tylko jeden raz,

Przykład:

operator s/// zmieni tylko raz znaleziony łańcuch,

$_ = "Seprob jest bardzo ale to bardzo slaby w Perlu";

s/bardzo/niebardzo/;

print "$_\n";

jeżeli dodamy modyfikator /g oto co się stanie,

$_ = "Seprob jest bardzo ale to bardzo slaby w Perlu";

s/bardzo/niebardzo/;

print "$_\n";

- \U i \L, wymusza aby wszystko co po nich wystąpi pisane było odpowiednio wielkimi i małymi literami, jeżeli użyjesz \u lub \l dotyczyło to będzie jedynie następnego znaku,

Przykład:

$_ = "jestem SEPROB";

# Znajdz lanuch "jestem seprob" i zapamietaj kazdy wyraz a nastepnie
# zamien pierwszy znak z "jestem" na duzy a takze zamien wszystkie litery w
# "seprob" na duze, wszystko odszukuj bez wzgledu na wielkos liter

s/(jestem) (seprob)/\u$1 \L$2/gi;

print "$_\n";

- \E, wyłącza zmianę wielkości liter,

Przykład:

$_ = "jestem seprob";

s/(jestem) (seprob)/\U$1\E $2/gi;

print "$_\n";

- operator split, działa w ten sposób ze zwraca listę łańcuchów oddzielonych danym wzorcem,

$_ = "Mieszkaja u mnie mama, tata, brat, kotek i moj komputer, Sepper";

@spliters = split /,\s/;

print "@spliters\n";

- funkcja join, działa odwrotnie do split, mianowicie służy do łączenia łańcuchów za pomocą podanego łańcucha,

Przykład:

$_ = "Mieszkaja u mnie mama, tata, brat, kotek i moj komputer, Sepper";

@spliters = split /,\s/;

print "@spliters\n";

$joined = join ", ", @spliters;

print "$joined\n";

4. Epilog

To wszystko. Jak zwykle odsyłam do manuali perla i polecam ksiażke "Perl.
Wprowadzenie" dla tych którzy chcą rozpocząć przygodę z Perlem. Jest on bardzo przydatny i ceniony przez pracodawców i administratorów.