Regularni vyrazyJe 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 prvkyNejjednodussim 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 vyrazyNekdy 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 (
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
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
HraniceDalsi 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
OpakovaniVelmi 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 (
Druhym casto pouzivanym poctem je nepovinny vyskyt. Tedy test na nanejvys jeden
vyskyt daneho retezce. Ve vim se vyznacuje pomoci
Specialni znakyMozna 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 \\ .
ZavorkyOpakovani se tyka pouze posledniho regularniho vyrazu. V retezciahoj\+ 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
NeboPoslednim 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. © 1997, 1998 Pavel Satrapa |