Regularni vyrazy

Je nacase opet se trochu odlisit od prumeru. Vyhledavany objekt totiz nemusi byt jen pouhy retezec znaku. Ve skutecnosti se jedna o tak zvany regularni vyraz. Jeho prostrednictvim lze zadavat i znacne komplikovane pozadavky, ktere ma vyhledavany (a pripadne nahrazovany, jak uvidite v casti o nahrazovani textu) splnovat.

Regularni vyraz jest chapati jako jakousi sablonu, kterou vim priklada na text a zkouma, zda vyhovuje. V okamziku, kdy text odpovida sablone, zajasa a premisti na nej kurzor.

Zakladni prvky

Nejjednodussim typem regularniho vyrazu je prosty znak - pismeno, cislice a podobne. Jemu vyhovi stejny znak v textu. Takze napriklad /a hleda pismeno "a", pripadne (pokud mate zapnuto :set ignorecase) i "A". Pokud za sebou zretezite nekolik regularnich vyrazu, hleda vim v textu zretezeni prvku, ktere vyhovuji jednotlivym vyrazum v tom poradi, v nemz jsou uvedeny. Dusledkem je klasicke hledani retezce. /ahoj obsahuje regularni vyraz, ktery vznikl zretezenim ctyr elementarnich, obsahujicich jednotliva pismena. Vysledkem je prirozene chovani - hleda se retezec "ahoj".

Zobecnujici vyrazy

Nekdy vam na jistem znaku nezalezi. To v regularnim vyrazu vyznacite teckou (.). Napriklad vyrazu /n.c vyhovi "nic", "noc" i jakykoli jiny retezec tri znaku, ktery zacina pismenem "n" a konci "c".

Obcas chcete, aby urcity znak mel jistou volnost, ale pouze v ramci vami danych moznosti. V takovem pripade uzavrete do hranatych zavorek ([...]) seznam pripustnych znaku. Hodlate-li napriklad mezi vyse zminenymi pismeny "n" a "c" strpet pouze samohlasku, nechte vyhledat /n[aeiou]c. Uvnitr hranatych zavorek jsou vyjmenovany pripustne varianty pro jeden znak. Celkove tedy tomuto regularnimu vyrazu vyhovi pouze triznakovy retezec.

Pokud by vyjmenovavanych variant bylo prilis, muzete si vypomoci pomlckou. Dva znaky oddelene uvnitr hranatych zavorek navzajem pomlckou znazornuji interval. Vyhovi mu libovolny znak, jehoz ASCII kod lezi mezi uvedenymi dvema. Napriklad cislice lze vyjadrit pomoci [0-9]. Hledate-li tedy v textu jmena souboru "xxx0" az "xxx9", poslouzi vam regularni vyraz /xxx[0-9].

Kdyz je prvnim znakem uvnitr hranatych zavorek striska (^), neguje jejich obsah. To znamena, ze vyhovi libovolny znak s vyjimkou tech, ktere jsou uvedeny v hranatych zavorkach. Pokud chcete vyjadrit, ze na jistem miste nesmi byt pismeno, muzete pouzit [^a-zA-Z]. Jestlize mate vypnuto rozlisovani velkych pismen od malych, staci [^a-z].

Hranice

Dalsi dva regularni vyrazy vyznacuji zacatek (znak ^) a konec (znak $) radku. Hledate-li radek, zacinajici slovem "From", pouzijte /^From. Specialitou je hledani prazdneho radku, ktere obstara /^$ (za zacatkem ma ihned nasledovat konec).

Pribuznymi znaku pro zacatek a konec radku jsou symboly \< a \>. Prvni oznacuje zacatek slova a druhe jeho konec. Kdybyste napriklad hledali zvratnou castici "se", nebylo by prilis stastne pouzit /se. V tomto pripade by totiz vim hledal retezec "se" i uvnitr slov, jako je sekera, konsekvence ci recese. Pri pouziti /\<se\> jsou podobne nadbytecne vyskyty vylouceny.

Opakovani

Velmi dulezitym prvkem regularnich vyrazu je opakovani. Pokud se predchozi reagularni vyraz muze opakovat, pridejte za nej hvezdicku (*). Ovsem pozor! Hvezdicka muze znamenat i nulovy pocet opakovani. Hledate-li radky, slozene ze samych pomlcek, muzete pouzit /^-*$. Takovemu vyrazu vsak vyhovi i radky prazdne. Pokud chcete, aby vim vyhledal jen radky s alespon jednou pomlckou, nasadte /^--*$. Zde je pozadovano, aby za zacatkem radku nasledovala pomlcka a po ni pak libovolny pocet dalsich.

Jelikoz pozadavek na alespon jeden vyskyt je pomerne casty, zavedl vim pro jeho ztelesneni dalsi specialni znak. Je jim plus (\+). Vyraz a\+ ma tedy stejny vyznam jako aa*.

Druhym casto pouzivanym poctem je nepovinny vyskyt. Tedy test na nanejvys jeden vyskyt daneho retezce. Ve vim se vyznacuje pomoci \=. Pokud byste napriklad hledali koncovky HTML souboru, ktere mohou byt .htm ci .html, poslouzi vam /\.html\=\>. Dvojznak \= za poslednim pismenem rika, ze "l" v retezci muze byt a nemusi.

Specialni znaky

Mozna jste si povsimli konstrukce \. v prikladu z predchoziho odstavce. Jeho prostrednictvim je zadan pozadavek na vyskyt tecky. vim pouziva obvykle konvence operacniho systemu Unix. Pokud maji nektere znaky specialni vyznam (jako napriklad ".", "*", "$" ci "\"), lze je do regularniho vyrazu vlozit tak, ze jim predsadite zpetne lomitko. Proto hledate-li hvezdicku, zdejte \* a pri odhalovani zpetnych lomitek vam pomuze \\.

Zavorky

Opakovani se tyka pouze posledniho regularniho vyrazu. V retezci ahoj\+ se proto opakovani vztahuje jen na pismeno "j", nikoli na cele slovo "ahoj". Pokud chcete do opakovani zahrnout viceznakovy regularni vyraz, obalte jej specialnimi zavorkami ve tvaru \( a \). V nasem pripade by regularni vyraz vypadal takto: \(ahoj\)\+.

Zavorky maji ve skutecnosti jeste mnohem zajimavejsi funkci. vim si totiz zapamatuje retezec, ktery jim vyhovel, a pozdeji jej muzete pouzit. Specialni konstrukce \n totiz predstavuje n-ty zapamatovany retezec. Tato schopnost se uplatni predevsim pri nahrazovani, ale i v hledani ji obcas muzete vyhodne vyuzit. Pokud napriklad hledate petiznakove palindromy (slova, ktera se nemeni, kdyz jsou ctena pozpatku - napriklad "rotor"), nasadte \(.\)\(.\).\2\1. Editor vyhleda vsechny retezce, obsahujici libovolny znak (ktery si zapamatuje pod cislem 1), za nim jeste jeden libovolny znak (zapamatovan pod cislem 2) a jeste jeden, za nimz nasleduje znak zapamatovany pod cislem 2 a na zaver jeste prvni zapamatovany.

Nebo

Poslednim vylepsenim regularnich vyrazu je moznost vyjadrit "nebo". Zajisti ji dvojznak \|. Hledate-li slovo "ahoj" nebo "nazdar", muzete pouzit prikaz /ahoj\|nazdar. Nebo ma ze vsech zde zminovanych konstrukci nejnizsi prioritu. Dvojznaky \| vlastne rozdeli regularni vyraz na nekolik casti. vim pak vyhleda retezce, ktere vyhovuji alepspon jedne z nich.

Doufam, ze nabidka schopnosti regularnich vyrazu na vas patricne zapusobila. V podstate jedinym zavaznejsim omezenim je, ze nelze vyhledavat vyrazy, ktere by zabiraly vice nez jeden radek. Autor vim jiz naznacil, ze ve verzi 6 s tim hodla neco udelat.

<-- predchozi  [obsah]  dalsi -->
© 1997, 1998 Pavel Satrapa