Peatükk 2. Mis on regulaaravaldis?

Regulaaravaldis on viis määrata tingimused, mis peavad millekski täidetud olema. Kui näiteks tavaliselt otsitakse tekstiredaktoris mingit sõna või märki/märke, siis saab otsitava teksti määrata sõna-sõnalt, regulaaravaldisena või siis andes ette teatud mustrit, millega otsitav peab sobima. Näiteks otsin sõna KDE, aga ainult rea alguses või otsin sõna see, aga see peab olema eraldi sõna või otsin faile, mis algavad sõnaga test, millele järgneb mingi number, näiteks test12, test107 ja test007.

Regulaaravaldisi saab luua alamavaldistest, nagu näiteks suurt Lego saab kokku panna väiksematest osakestest. Ja nagu Lego-maailmas, on ka siin teatud hulk elementaarseid põhiplokke. Järgnevalt kirjeldangi näidete varal kõiki neid põhiplokke.

Näide 2.1. Tavalise teksti otsimine.

Kui otsid lihtsalt tavalist teksti, ei ole regulaaravaldist erilist mõtet kasutada. Nimelt on regulaaravaldistes mõnedel märkidel eritähendus: .*|$. Nii et kui soovid otsida teksti kde. (s.t. tähti kde, millele järgneb punkt), siis tuleks see väljendada nii: kde\.[1] Tavalise . asemel tuleb niisiis kirjutada \., mida nimetatakse paomärgiks.


Näide 2.2. URL-i sobivus

Kui oled valinud KDE-s midagi, mis näeb välja nagu URL, pakub Klipper võimalust käivitada Konqueror antud URL-iga.

Klipper suudab seda teha valikut kokku sobitades mitme erineva regulaaravaldisega ja kui üks neist sobib, pakutaksegi välja vastav võimalus.

Regulaaravaldised URL-i jaoks määravad (lisaks muudele asjadele), et valik peab algama tekstiga http://. Regulaaravaldises kirjeldatakse seda tekstile http:// katust (märk ^) ette asetades.

Ülaltoodu on näide positsiooni kasutamisest regulaaravaldises. Samamoodi saab realõpu positsiooni määrata dollarimärgiga $.


Näide 2.3. Sõna see, aga mitte sees, glassee või metseen otsimine

Selle leidmiseks saab kasutada kaht täiendavat positsioonitüüpi, nimelt sõnapiire ja mitte-sõnapiire. Positsioone määratakse väljenditega \b (sõnapiire) ja \B (mitte-sõnapiire)

Nii saab sõna see otsida regulaaravaldisega \bsee\b. See määrab, et otsitakse sõna see, millel ei eelneks ega järgneks tähti (s.t. et tegu oleks sõnapiirdega nii sõna ees kui järel)

Nelja regulaaravaldise positsiooniväljendust saab redaktoris lisada nelja erineva positsioonivahendi abil


Näide 2.4. Kas see või too otsimine

Oletame, et soovid oma dokumendis otsida nii sõna see kui ka sõna too. Tavalist otsingut kasutades pead operatsiooni kaks korda ette võtma, otsides esimesel korral sõna see ja teisel too.

Regulaaravaldise abil saab mõlemat korraga otsida. Selleks tuleb otsida väljendit see|too ehk siis eraldada kaks otsitavat sõna püstkriipsuga.[2]

Regulaaravaldiste redaktoris ei pea sa püstkriipsu ise kirjutama, piisab, kui valida alternatiivivahend ja lisada alamregulaaravaldised teineteise peale.


Näide 2.5. Suvalise sobimine

Regulaaravaldisi võrreldakse sageli metamärkide kasutamisega shellis, see tähendab võimega määrata korraga mitu faili tärni kasutades. Ilmselt tunned järgmistes näidetes ära metamärgi kasutamise:

  • ls *.txt - siin on *.txt shelli metamärk, mis tähistab sobivust iga failiga, mille nime lõpus on *.txt

  • cat test??.res - sobib iga fail, mille alguses on test, millele järgneb kaks suvalist märki ja mis lõpeb märkidega .res

Shellis tähistab tärn suvalist märki, mis esineb suvaline arv korda. Teisisõnu vastab tärn suvalisele. Regulaaravaldises tähistatakse seda .*. Punkt tähendab siin suvalist üksikut, s.t ainult üht märki ning tärn seda, et sellele eelnev regulaaravaldis võib sobida suvaline arv kordi. Koos tähendabki see suvalise märgi sobivust suvaline arv kordi.

See võib tunduda üsna keerulisena, aga kui taipad asja tuuma, saad küllap aru, kui võimas see on. Võtame ette veel ühe elementaarse regulaaravaldise: a. Täht a omaette tähendab sobivust üksiku märgiga, nimelt tähega a. Kui me ühendame ta aga tärniga, s.t a*, siis on meil tegemist regulaaravaldisega, mis sobib suvalise arvu a-dega.

Mitut regulaaravaldist on võimalik kombineerida, asetades nad üksteise järele, näiteks ba(na)*. [3] Oletades, et kirjutasid selle regulaaravaldise tekstiredaktori otsinguväljale, leiad lisaks muudele näiteks järgmised sõnad: ba, bana, banana, bananananananana

Eeltoodust lähtudes ei ole sul loodetavasti kuigi keeruline kirjutada shelli metamärgiga otsing test??.res regulaaravaldisena. Õige vastus: test..\.res. Punkt tähistab suvalist märki. Üksiku punkti jaoks tuleb kirjutada \.[4]. Teisisõnu vastab regulaaravaldis \. punktile, punkt omaette aga suvalisele märgile.

Regulaaravaldiste redaktoris luuakse korduvad regulaaravaldised kordusvahendi abil


Näide 2.6. & asemel & HTML -dokumendis

HTML -keeles tuleb erimärk & kirjutada kujul &&, mis mõnevõrra sarnaneb paomärgi kasutamisega regulaaravaldises.

Oletame, et kirjutasid HTML -dokumendi tavalises redaktoris (nt. XEmacs või Kate) ning unustasid täiesti selle reegli. Nüüd oled mures, sest pead asendama kõik märgid & märgiga &.

Seda saab hõlpsast teha ka tavalist otsimist ja asendamist kasutades, aga sellel on üks väike häda küljes. Oletame, et teksti kirjutades mõnel korral sul see reegel siiski meenus - aga ainult mõnel korral. Tingimusteta asendamine tähendab nüüd seda, et & asemele ilmub &

Tegelikult aga soovid ju seda, et & asendataks ainult siis, kui sellele ei järgne amp;. Seda saab teha regulaaravaldisega, kui kasutada positiivset ettevaadet.

Regulaaravaldis, mis sobib ainult ja-märgiga, kui sellele ei järgne märke amp;, näeb välja selline: &(?!amp;). Seda on mõistagi lihtsam lugeda regulaaravaldiste redaktorit kasutades, kus saab tarvitada ettevaadete vahendeid.




[1] Regulaaravaldise redaktor lahendab selle probleemi sinu eest, hoolitsedes paomärkide õigesse kohta asetamise eest.

[2] Arvesta, et mõlemal pool püstkriipsu asub regulaaravaldis, nii et selle võimalusega ei saa otsida mitte ainult kaht erinevat tekstiosa, vaid ka kaht erinevat regulaaravaldise sobivust.

[3] (na)* tähendab lihtsalt seda, et sulgudes olev võib esineda suvaline arv kordi.

[4] Seda nimetatakse antud juhul paomärgiks