PERL – regulérne výrazy

22. září 2000

Dnes sa dozviete niečo o najsilnejších zbraniach Perlu – regulérnych výrazoch. Aj keď sú RE v niektorých jazykoch zabudované, zistíte že Perl je na to najlepšie.

Regulérne výrazy

Konečne sme sa dostali k najlepšej vymoženosti Perlu. Regulérne výrazy sú nástroje na prácu s textom. Či už na vyhľadávanie alebo zamieňanie textu. Možno si teraz hovorít nič moc, ale keď sa pustíte pred poriadnu úlohu, na 90% ich využijete.

Vyhľadávanie

Regulérne výrazy sú vždy uzavreté v lomítkach. Ak chceme v nejakom reťazci vyhľadávať alebo zamieňať text pomocou regulérnych výrazov, použijeme za premennou =~:

$text =~ /jano/;

Tento primitívny výraz vráti hodnotu True ak v reťazci $text je slovo jano. Regulérne výrazy sú štandardne case-sensitive (rozoznávajú malé a veľké písmenká). Ďalší príklad vráti True ak sa slovo jano v texte nenachádza:

$text !~ /jano/;

Ak chceme vyhľadávať case-insensitive tak použijeme parameter i:

$text =~ /jano/i;

Tento výraz vráti True ak nájde Jano, jano JaNo jaNO…

Nahradzovanie znakov

Nahradzovanie znakov v praxi sa veľmi často nepoužíva. Ale aby ste vedeli o čo ide, tak si aj o tom niečo napíšeme. Tu je prvý príklad:

$text =~ tr/zoznam1/zoznam2/;

Regulérny výraz sa začína značkou tr, ktorá povie Perlu, že ide o nahradzovanie znakov. Prvý zoznam znakov sa nahradí druhým zoznamom v tom istom poradi. Výraz vráti počet vymenených znakov:

$text = ‚abeceda‘;
$pocet = ($text =~ tr/abc/ABC/);

$text bude mať hodnotu ABeCedA a $pocet 4. Ak by sme chceli písmenká iba zmazať, tak že by sme v druhom zozname nič nanapísali nič by sa nestalo. Preto pridáme parameter d:

$text =~ tr/abc//d;

$text bude eed. Ďalším použiteľným parametrom je c. Ten spôsobuje výmenu všetkých písmen ktoré niesú v prvom zozname za pozledný znak v druhom zozname:

$text =~ tr/abc/R/c;

$text je abRcRRa.

Nahradzovanie reťazcov

Nahradzovanie reťazcov budete potrebovať skoro v každom skripte. Tu je vzor:

$text =~ s/slovo1/slovo2/;

Pri nahradzovaní sa používa predpona s. Slovo1 nahradí slovo2. Výraz vráti počet výmen. Ale ak by ste výraz napísal v takomto tvare, vrátil by vždy 1. Na výmenu všetkých nájdených slov sa používa parameter g (global):

$text = ‚riby korito rieka‘;
$text =~ s/ri/ry/g;

$text bude ryby koryto rieka. Aj tu môžete použiť parameter i pre necitlivosť na veľké a malé písmená.

Špeciálne znaky

Určite ste postrehli, že som v príkladoch niekde použil špeciálny znak \n, ktorý znamená enter (nový riadok). Ak nie vyskúšajte pomocou regulérnych výrazov vymeniť znak / za iný. Kým nepoužijete špeciálne znaky nieje šanca. Tu je tabulka špeciálnych znakov:

^ žačiatok reťazca
$ koniec reťazca
. ľuboľný znak okrem \n
+ aspoň jeden predchádzajúci znak
* žiadny alebo viac výskytov predchádzajúceho znaku
? žiadny alebo viacej výskytov predchádzajúceho znaku
[..] skupina znakov, z ktorých jeden vyhovuje
[^..] skupina znakov, z ktorých ani jeden vyhovuje
(..) reťazec, ktorý sa ukladá do \1 až \9
(..|..|..) jeden z možností
{X, Y} opakovanie predchádzajúceho znaku minimálne X, maximálne Y-krát
\n nový riadok
\t Tab
\f Line Feed
\r Carriage Return
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\d [0-9]
\D [^0-9]
\s [ \n\t\r\f]
\S [^ \n\t\r\f]
\b hranica slova (neakceptuje diakritiku)
\B nieje hranica slova

Okrem špeciálnych znakov existujú ešte aj metaznaky. Metaznaky sú obyčajné znaky pred ktoré sa dáva \. Metaznaky sú: \ | ( ) [ { ^ $ * + ? . @ a aj “ keď ho chcete zadať do reťazca (ale nie v reg. výrazoch).

Teraz si ukážeme využitie zátvoriek a premenných \1 až \9. Je to veľmi výhodné, keď nevieme ktorý prvok zo zoznamu vyhovuje. Dajme si teraz takú fiktívnu úlohu a spravne zvýrazňovanie keywords v zdrojáku. Ako sami uvidítete, riešenie je jednoduchšie než samotná úloha:

$text=~s/(do|while|until|last|next)/<B>\1</B>/ig;

Teraz o niečo ťažšia úloha. Spravme si kontrolór správnej e-mailovej adresy. Ako vieme email má formát text@text.kod. To by bolo takto:

$email=~/^.+\@.+\..+$/

Lenže, email nemôže obsahovať diakritiku a kód krajiny môže byť dvoj alebo trojpísmenkový:

$email=~/^\w+\@\w+\.\w{2,3}$/

Ale my vieme, že existujú aj adresy ja-ty.my@rod-ina.59.com. Takže náš výraz upravíme tak, aby správne skontroloval aj takéto adresy:

if ($email!~/^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w{2,3}$/){
print „Zlá adresa!“;
}

Dúfam, že ste sa dozvedeli opäť niečo nové. Nabudúce sa podrobnejšie pozrieme na špeciálne premenné.

Pozn. red.: Seriál musel být předčasně ukončen, protože autor nedodal slíbená pokračování. Máte-li zájem v seriálu pokračovat vlastními články, prosíme, kontaktujte redakci.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *