[ 30. December 1999]
- Svato_Straka
Regulßrne v²razy v Perli - 6. Φas¥ CGI
Ako som u₧ minule s╛·bil, dneÜnß Φas¥ nßÜho rozprßvania o CGI sa bude venova¥ Perlu, najpou₧φvanejÜiemu jazyku pre tvorbu CGI aplikßciφ.
Nie vÜak Perlu celkovo, ale povieme si nieΦo o regulßrnych v²razoch, ktorΘ dßvaj· Perlu obrovsk· silu pri spracovßvanφ textov²ch dßt.
Regulßrne v²razy (preklad z anglickΘho regular expressions, niekedy sa pou₧φva aj skratka regexp) s· zrejme znßme vÜetk²m u₧φvate╛om Linuxu. PerlovskΘ reg. v²razy s· ve╛mi podobnΘ t²m, ktorΘ pou₧φva aj program egrep. Aj ke∩ sa vßm m⌠₧u zda¥ regulßrne v²razy ako nepreh╛adnß sple¥ znakov, ke∩ ich pochopφte a pochopφte aj sp⌠sob ich interpretovania jazykom Perl, zφskate pravdepodobne najsilnejÜφ nßstroj na prßcu s textom, s ak²m ste kedy mohli pracova¥.
Regulßrne v²razy vlastne vykonßvaj· porovnßvanie re¥azca so zadan²m vzorom. Ak je vzor v re¥azci nßjden², mßte nieko╛ko mo₧nostφ, ako v²sledok takΘhoto porovnßvania vyu₧i¥. Pri be₧nom porovnßvanφ vßs zaujφma, Φi re¥azec obsahuje vzor. Ak ßno, regexp vßm vrßti pravdiv· hodnotu a vy m⌠₧ete vykona¥ urΦit² blok prφkazov. Ak pou₧ijete pri porovnßvanφ prφkaz nahradenia, pri nßjdenφ vzoru sa zamenφ postupnos¥ vyh╛adßvan²ch znakov za in² vami urΦen² re¥azec. Poslednou mo₧nos¥ou porovnßvania je prφkaz split, s ktor²m ste sa mohli stretn·¥ v predchßdzaj·cej Φasti nßÜho serißlu o CGI. Tento vrßti po porovnanφ vÜetky miesta, s ktor²mi sa vzor nezhoduje.
V zßsade platφ, ₧e vΣΦÜina znakov v regulßrnych v²razov sa zhoduje sama so sebou. Pok²m v reg. v²raze uvediete viac znakov za sebou, tieto sa musia zhodova¥ presne v danom poradφ. To znamenß, ₧e ak uvediete napr. reg. v²raz
/ahoj/
bude sa zhodova¥ len vtedy, ak dan² re¥azec bude obsahova¥ podre¥azec "ahoj". OstatnΘ znaky s· metaznaky a samy so sebou sa nezhoduj·. Ak chcete v porvnßvanφ pou₧i¥ aj zhodu na nejak² znak, ktor² je metaznakom, musφte pred nφm uvies¥ znak "" (obrßtenΘ lomφtko). Tu je zoznam metaznakov:
| ( ) [ { ^ $ * + ? .
Ako som u₧ spomenul, obrßtenΘ lomφtko menφ metaznak na obyΦajn² znak (znakov² literßl). Pok²m teda chcete pou₧i¥ obrßtenΘ lomφtko ako znakov² literßl, musφte pou₧i¥ postupnos¥ znakov \. Ak vÜak pou₧ijete obrßtenΘ lomφtko pred znakov²m literßlom, bude tento zmenen² na metaznak alebo nejak² druh postupnosti.
╧alÜou vecou, s ktorou sa m⌠₧ete pri reg. v²razoch stretn·¥, s· kvantifikßtory. Tieto urΦuj·, ko╛kokrßt po sebe sa musφ zadan² vzor zhodova¥. Kvantifikßtory sa vÜak via₧u v₧dy len na znak, za ktor²m nasleduj·, ak chcete kvantifikova¥ vzor obsahuj·ci viac znakov, musφte tieto zoskupi¥ pomocou zßtvoriek:
/(ahoj){2}/
Φo vyvolß zhodu v prφpade, ak porovnßvan² re¥azec bude obsahova¥ podre¥azec "ahojahoj". Naproti tomu:
/ahoj{2}/
sa bude zhodova¥ s "ahojj". V nasleduj·cej tabu╛ke s· uvedenΘ pou₧φvanΘ kvantifikßtory:
Ke∩₧e s· vzory porovnßvanΘ ako re¥azce v ·vodzovkßch, funguje aj v regulßrnych v²razoch vkladanie premenn²ch. Ak teda
$foo = "ahoj";
zhodu sp⌠sobφ
/$foo/ aj /ahoj/
Vkladanie premenn²ch vÜak sp⌠sobuje spomalenie porovnßvania, preto₧e premennß sa m⌠₧e meni¥ (ve∩ od toho je premennß) a vzor musφ by¥ zaka₧d²m znovu prelo₧en². AvÜak pozor, kedyko╛vek je znak "$" nasledovan² znakom pipe (zvislß Φiara), uzatvßracou gu╛atou zßtvorkou alebo koncom re¥azca, bude interpretovan² ako koniec riadku, nie ako vkladanie premennej.
Ke∩₧e je problematika regulßrnych v²razov pomerne obsiahla, nabud·ce budeme pokraΦova¥ a povieme si Φosi o pravidlßch porovnßvania regulßrnych v²razov.
|
|
|