![]() |
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 |