Pri popise príkazu cyklu DO sme si uviedli ďalšie varianty makra pre odstraňovanie viacnásobných medzier. Na prvý pohľad by sme už mohli byť s výsledok spokojní – uvedené príklady makier naozaj vyriešia naše požiadavky. Na druhej strane si však musíme uvedomiť, že vo všetkých príkladoch makro opakovane prehliada celý dokument, čo môže byť časovo náročné.
Aby sme mohli zlepšiť tento stav, musíme zmeniť spôsob vyhľadávania. Našťastie OpenOffice.org podporuje vyhľadávanie pomocou regulárnych výrazov. Teraz sa snáď mnohí opýtajú, čo to vlastne regulárne výrazu sú. V jednoduchosti môžeme povedať, že je to vyhľadávanie pomocou zástupných znakov. Ako príklad môžeme použiť napr. príkaz DIR, ktorý pochádza ešte z operačného systému DOS, kde sme mohli vyhľadávať súbory pomocou tzv. hviezdičkovej konvencie. Hviezdičky vlastne nahrádzali ľubovoľný textový reťazec. Okrem toho sa mohol používať aj znak otáznika, ktorý nahrádzal presne jeden znak.
Samozrejme, možnosti príkazu DIR nie sú skutočné vyhľadávanie pomocou regulárnych výrazov, týmto príkladom sme chceli iba naznačiť problematiku.
SUB dvojita_medzera
DIM Dokument, Vymena AS object
DIM kolko AS Long
Dokument=ThisComponent
Vymena=Dokument.createReplaceDescriptor()
' Budeme hľadať popomocou regulárnych výrazov
Vymena.SearchRegularExpression=True
'Hľadáme medzeru, za ktorou sa nachádza ešte jedna a viac medzier
Vymena.SearchString=" +"
Vymena.ReplaceString=" "
kolko=Dokument.replaceAll(Vymena)
msgbox("Nahradených "+kolko+" viacnásobných medzier.",0,"Viacnásobne medzery")
END SUB
Ako vidíme, naše makro sa veľmi zjednodušilo. Pomocou príkazu:
Vymena.SearchRegularExpression=True
sme zabezpečili vyhľadávanie pomocou regulárnych príkazov, pričom pomocou reťazca " +" sme vyhľadali všetky viacnásobné medzery.
Zdá sa, že naše makro je už naozaj dobré a že na ňom už nemáme čo zlepšovať. Nie je to tak, pretože ešte má svoje nedostatky – nedokáže odstrániť napríklad nadbytočné medzery na začiatku alebo na konci odstavca a pod. Pretože však používame regulárne výrazy, nebude nám teraz robiť problém naprogramovať aj tieto možnosti:
SUB dvojita_medzera
DIM Dokument, Vymena AS object
DIM kolko AS Long
Dokument=ThisComponent
Vymena=Dokument.createReplaceDescriptor()
' Budeme hľadať popomocou regulárnych výrazov
Vymena.SearchRegularExpression=True
'Hľadáme medzeru, za ktorou sa nachádza ešte jedna a viac medzier
Vymena.SearchString=" +"
Vymena.ReplaceString=" "
kolko=Dokument.replaceAll(Vymena)
Vymena.SearchRegularExpression=True
'Hľadáme zbytočné medzery na začiatku odstavca
Vymena.SearchString="^ *"
' ktoré vymažeme
Vymena.ReplaceString=""
kolko=kolko+Dokument.replaceAll(Vymena)
Vymena.SearchRegularExpression=True
'Hľadáme zbytočné medzery na konci odstavca
Vymena.SearchString=" *$"
' ktoré vymažeme
Vymena.ReplaceString=""
kolko=kolko+Dokument.replaceAll(Vymena)
msgbox("Nahradených "+kolko+" viacnásobných medzier.",0,"Viacnásobne medzery")
END SUB
Na budúce: Regulárne výrazy pod drobnohľadom, alebo čo tie hviezdičky a striešky všetko znamenajú.