Regulßrnφ v²razy

Je naΦase op∞t se trochu odli╣it od pr∙m∞ru. Vyhledßvan² objekt toti╛ nemusφ b²t jen pouh² °et∞zec znak∙. Ve skuteΦnosti se jednß o tak zvan² regulßrnφ v²raz. Jeho prost°ednictvφm lze zadßvat i znaΦn∞ komplikovanΘ po╛adavky, kterΘ mß vyhledßvan² (a p°φpadn∞ nahrazovan², jak uvidφte v Φßsti o nahrazovßnφ textu) spl≥ovat.

Regulßrnφ v²raz jest chßpati jako jakousi ╣ablonu, kterou vim p°iklßdß na text a zkoumß, zda vyhovuje. V okam╛iku, kdy text odpovφdß ╣ablon∞, zajßsß a p°emφstφ na n∞j kurzor.

Zßkladnφ prvky

Nejjednodu╣╣φm typem regulßrnφho v²razu je prost² znak - pφsmeno, Φφslice a podobn∞. Jemu vyhovφ stejn² znak v textu. Tak╛e nap°φklad /a hledß pφsmeno "a", p°φpadn∞ (pokud mßte zapnuto :set ignorecase) i "A". Pokud za sebou z°et∞zφte n∞kolik regulßrnφch v²raz∙, hledß vim v textu z°et∞zenφ prvk∙, kterΘ vyhovujφ jednotliv²m v²raz∙m v tom po°adφ, v n∞m╛ jsou uvedeny. D∙sledkem je klasickΘ hledßnφ °et∞zce. /ahoj obsahuje regulßrnφ v²raz, kter² vznikl z°et∞zenφm Φty° elementßrnφch, obsahujφcφch jednotlivß pφsmena. V²sledkem je p°irozenΘ chovßnφ - hledß se °et∞zec "ahoj".

Zobec≥ujφcφ v²razy

N∞kdy vßm na jistΘm znaku nezßle╛φ. To v regulßrnφm v²razu vyznaΦφte teΦkou (.). Nap°φklad v²razu /n.c vyhovφ "nic", "noc" i jak²koli jin² °et∞zec t°φ znak∙, kter² zaΦφnß pφsmenem "n" a konΦφ "c".

ObΦas chcete, aby urΦit² znak m∞l jistou volnost, ale pouze v rßmci vßmi dan²ch mo╛nostφ. V takovΘm p°φpad∞ uzav°ete do hranat²ch zßvorek ([...]) seznam p°φpustn²ch znak∙. Hodlßte-li nap°φklad mezi v²╣e zmφn∞n²mi pφsmeny "n" a "c" strp∞t pouze samohlßsku, nechte vyhledat /n[aeiou]c. Uvnit° hranat²ch zßvorek jsou vyjmenovßny p°φpustnΘ varianty pro jeden znak. Celkov∞ tedy tomuto regulßrnφmu v²razu vyhovφ pouze t°φznakov² °et∞zec.

Pokud by vyjmenovßvan²ch variant bylo p°φli╣, m∙╛ete si vypomoci pomlΦkou. Dva znaky odd∞lenΘ uvnit° hranat²ch zßvorek navzßjem pomlΦkou znßzor≥ujφ interval. Vyhovφ mu libovoln² znak, jeho╛ ASCII k≤d le╛φ mezi uveden²mi dv∞ma. Nap°φklad Φφslice lze vyjßd°it pomocφ [0-9]. Hledßte-li tedy v textu jmΘna soubor∙ "xxx0" a╛ "xxx9", poslou╛φ vßm regulßrnφ v²raz /xxx[0-9].

Kdy╛ je prvnφm znakem uvnit° hranat²ch zßvorek st°φ╣ka (^), neguje jejich obsah. To znamenß, ╛e vyhovφ libovoln² znak s v²jimkou t∞ch, kterΘ jsou uvedeny v hranat²ch zßvorkßch. Pokud chcete vyjßd°it, ╛e na jistΘm mφst∞ nesmφ b²t pφsmeno, m∙╛ete pou╛φt [^a-zA-Z]. Jestli╛e mßte vypnuto rozli╣ovßnφ velk²ch pφsmen od mal²ch, staΦφ [^a-z].

Hranice

Dal╣φ dva regulßrnφ v²razy vyznaΦujφ zaΦßtek (znak ^) a konec (znak $) °ßdku. Hledßte-li °ßdek, zaΦφnajφcφ slovem "From", pou╛ijte /^From. Specialitou je hledßnφ prßzdnΘho °ßdk∙, kterΘ obstarß /^$ (za zaΦßtkem mß ihned nßsledovat konec).

P°φbuzn²mi znak∙ pro zaΦßtek a konec °ßdku jsou symboly \< a \>. Prvnφ oznaΦuje zaΦßtek slova a druhΘ jeho konec. Kdybyste nap°φklad hledali zvratnou Φßstici "se", nebylo by p°φli╣ ╣╗astnΘ pou╛φt /se. V tomto p°φpad∞ by toti╛ vim hledal °et∞zec "se" i uvnit° slov, jako je sekera, konsekvence Φi recese. P°i pou╛itφ /\<se\> jsou podobnΘ nadbyteΦnΘ v²skyty vylouΦeny.

Opakovßnφ

Velmi d∙le╛it²m prvkem regulßrnφch v²raz∙ je opakovßnφ. Pokud se p°edchozφ reagulßrnφ v²raz m∙╛e opakovat, p°idejte za n∞j hv∞zdiΦku (*). Ov╣em pozor! Hv∞zdiΦka m∙╛e znamenat i nulov² poΦet opakovßnφ. Hledßte-li °ßdky, slo╛enΘ ze sam²ch pomlΦek, m∙╛ete pou╛φt /^-*$. TakovΘmu v²razu v╣ak vyhovφ i °ßdky prßzdnΘ. Pokud chcete, aby vim vyhledal jen °ßdky s alespo≥ jednou pomlΦkou, nasa∩te /^--*$. Zde je po╛adovßno, aby za zaΦßtkem °ßdku nßsledovala pomlΦka a po nφ pak libovoln² poΦet dal╣φch.

Jeliko╛ po╛adavek na alespo≥ jeden v²skyt je pom∞rn∞ Φast², zavedl vim pro jeho zt∞lesn∞nφ dal╣φ specißlnφ znak. Je jφm plus (\+). V²raz a\+ mß tedy stejn² v²znam jako aa*.

Druh²m Φasto pou╛φvan²m poΦtem je nepovinn² v²skyt. Tedy test na nanejv²╣ jeden v²skyt danΘho °et∞zce. Ve vim se vyznaΦuje pomocφ \=. Pokud byste nap°φklad hledali koncovky HTML soubor∙, kterΘ mohou b²t .htm Φi .html, poslou╛φ vßm /\.html\=\>. Dvojznak \= za poslednφm pφsmenem °φkß, ╛e "l" v °et∞zci m∙╛e b²t a nemusφ.

Specißlnφ znaky

Mo╛nß jste si pov╣imli konstrukce \. v p°φkladu z p°edchozφho odstavce. Jeho prost°ednictvφm je zadßn po╛adavek na v²skyt teΦky. vim pou╛φvß obvyklΘ konvence operaΦnφho systΘmu Unix. Pokud majφ n∞kterΘ znaky specißlnφ v²znam (jako nap°φklad ".", "*", "$" Φi "\"), lze je do regulßrnφho v²razu vlo╛it tak, ╛e jim p°edsadφte zp∞tnΘ lomφtko. Proto hledßte-li hv∞zdiΦku, zdejte \* a p°i odhalovßnφ zp∞tn²ch lomφtek vßm pom∙╛e \\.

Zßvorky

Opakovßnφ se t²kß pouze poslednφho regulßrnφho v²razu. V °et∞zci ahoj\+ se proto opakovßnφ vztahuje jen na pφsmeno "j", nikoli na celΘ slovo "ahoj". Pokud chcete do opakovßnφ zahrnout vφceznakov² regulßrnφ v²raz, obalte jej specißlnφmi zßvorkami ve tvaru \( a \). V na╣em p°φpad∞ by regulßrnφ v²raz vypadal takto: \(ahoj\)\+.

Zßvorky majφ ve skuteΦnosti je╣t∞ mnohem zajφmav∞j╣φ funkci. vim si toti╛ zapamatuje °et∞zec, kter² jim vyhov∞l, a pozd∞ji jej m∙╛ete pou╛φt. Specißlnφ konstrukce \n toti╛ p°edstavuje n-t² zapamatovan² °et∞zec. Tato schopnost se uplatnφ p°edev╣φm p°i nahrazovßnφ, ale i v hledßnφ ji obΦas m∙╛ete v²hodn∞ vyu╛φt. Pokud nap°φklad hledßte p∞tiznakovΘ palindromy (slova, kterß se nem∞nφ, kdy╛ jsou Φtena pozpßtku - nap°φklad "rotor"), nasa∩te \(.\)\(.\).\2\1. Editor vyhledß v╣echny °et∞zce, obsahujφcφ libovoln² znak (kter² si zapamatuje pod Φφslem 1), za nφm je╣t∞ jeden libovoln² znak (zapamatovßn pod Φφslem 2) a je╣t∞ jeden, za nφm╛ nßsleduje znak zapamatovan² pod Φφslem 2 a na zßv∞r je╣t∞ prvnφ zapamatovan².

Nebo

Poslednφm vylep╣enφm regulßrnφch v²raz∙ je mo╛nost vyjßd°it "nebo". Zajistφ ji dvojznak \|. Hledßte-li slovo "ahoj" nebo "nazdar", m∙╛ete pou╛φt p°φkaz /ahoj\|nazdar. Nebo mß ze v╣ech zde zmi≥ovan²ch konstrukcφ nejni╛╣φ prioritu. Dvojznaky \| vlastn∞ rozd∞lφ regulßrnφ v²raz na n∞kolik Φßstφ. vim pak vyhledß °et∞zce, kterΘ vyhovujφ alepspo≥ jednΘ z nich.

Doufßm, ╛e nabφdka schopnostφ regulßrnφch v²raz∙ na vßs pat°iΦn∞ zap∙sobila. V podstat∞ jedin²m zßva╛n∞j╣φm omezenφm je, ╛e nelze vyhledßvat v²razy, kterΘ by zabφraly vφce ne╛ jeden °ßdek. Autor vim ji╛ naznaΦil, ╛e ve verzi 6 s tφm hodlß n∞co ud∞lat.

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