![]() |
Regulßrnφ v²razyJe 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φ prvkyNejjednodu╣╣φ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²razyN∞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 (
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φ
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
HraniceDal╣φ 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
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 (
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φ
Specißlnφ znakyMo╛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ßvorkyOpakovßnφ se t²kß pouze poslednφho regulßrnφho v²razu. V °et∞zciahoj\+ 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
NeboPoslednφ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. © 1997, 1998 Pavel Satrapa |