<othercredit role="translator"><firstname>Marek</firstname><surname>Laane</surname><affiliation><address><email>bald@online.ee</email></address></affiliation><contrib>Tõlge eesti keelde</contrib></othercredit>
<para><emphasis>Regulaaravaldised</emphasis> võimaldavad meil kirjeldada mingi tekstistringi võimalikku sisu moel, millest arvuti aru saab, nii et meil on võimalik otsida tekstist selle stringi võimalikke vasteid ning selleks suutlike rakenduste korral ka vajadusel leitud millegagi asendada.</para>
<para>Näide: oletame, et soovid leida tekstist lõigud, mille alguses seisaks nimi <quote>Henrik</quote> või <quote>Pernilla</quote> ja millele järgneks verbi <quote>ütlema</quote> mingi vorm.</para>
<para>Tavalise otsingu puhul alustaksid ilmselt esimese nime <quote>Henrik</quote> otsimisega, millele järgneks <quote>ütle</quote>, näiteks <userinput>Henrik ütle</userinput>, ning sobivuste otsimisel tuleks kõrvale heita need, mis ei seisa lõigu alguses, samuti need, kus <quote>ütle</quote> vasteks ei ole mitte <quote>ütles</quote> või <quote>ütleb</quote>, mis sind huvitavad, vaid midagi muud. Ja siis tuleb seda kõike korrata järgmise nimega...</para>
<para>Regulaaravaldist kasutades saab selle ülesande sooritada üheainsa otsinguga ning märksa täpsemalt.</para>
<para>Selleks määravad regulaaravaldiswed üldistavad, kuid ometi üksikasjalikud reeglid sobiva stringi leidmiseks. Meie näiteks võiks seda sõnades väljendada nii: <quote>Rida, mille alguses seisab kas <quote>Henrik</quote> või <quote>Pernilla</quote> (millele võib järgneda kuni neli tühi- või tabeldusmärki), millele järgneb tühimärk, millele järgneb <quote>ütle</quote>, millele järgneb kas <quote>s</quote> või <quote>b</quote></quote>. Ja regulaaravaldisena näeks see välja nii:</para> <para><userinput>^[ \t]{0,4}(Henrik|Pernilla) ütle(s|b)</userinput></para>
<para>Toodud näites on kasutatud kõiki nelja moodsas regulaaravaldises kasutatavat põhimõtet, nimelt:</para>
<para>Avaldist alustav katus (<literal>^</literal>) on eeldus, olles õige ainult juhul, kui järgnev string asub tõesti rea alguses.</para>
<para>Stringid <literal>[ \t]</literal> ja <literal>(Henrik|Pernilla) ütle(s|b)</literal> on mustrid. Esimene on <emphasis>märgiklass</emphasis>, millele vastab kas tühik või (horisontaalne) tabeldusmärk, teine muster sisaldab kõigepealt alammustrit, millele vastab kas <literal>Henrik</literal> <emphasis>või</emphasis> <literal>Pernilla</literal>, seejärel osa, millele vastab täpselt string <literal> ütle</literal>, ning lõpuks alammustrit, millele vastab kas <literal>s</literal> <emphasis>või</emphasis> <literal>b</literal>.</para>
<para>String <literal>{0,4}</literal> on kvantor, mis annab teada <quote>kuskil 0 kuni 4 kaugusel eelmisest</quote>.</para>
<para>Et regulaaravaldise rakendus, mis toetab <emphasis>tagasiviiteid</emphasis>, salvestab kogu stringi sobiva osa, samuti sulgudesse võetud alammustrid, võime nii kogu sobivust (regulaaravaldise otsingul redaktoris avatud tekstidokumendis märgitakse see enamasti valituks) või leitud nime või tegusõna viimase osa, mille kohta viited käivad, uuesti tarvitada.</para>
<para>Ühtekokku leiab avaldis sobivused sealt ja ainult sealt, kus me seda soovime.</para>
<para>Järgnevates osades kirjeldame põhjalikumalt, kuidas luua ja kasutada mustreid, märgiklasse, eeldusi, kvantoreid ja tagasiviiteid ning viimases osas pakume ka mõned tulusad näited.</para>
<para>Mustrid koosnevad literaalsetest stringidest ja märgiklassides. Mustrid võivad sisaldada alammustreid, mis kujutavad endast sulgudes antud mustrit.</para>
<para>Nii mustrites kui märgiklassides on mõnel märgil eritähendus. Neile literaalse sobivuse leidmiseks tuleb nad spetsiaalselt märkida ehk <emphasis>pakku päästa</emphasis>, et regulaaravaldise rakendus aru saaks, et neid märke tuleb käsitleda mitte metamärkide, vaid just nende märkidena, mida nad inimeste arvates peaksidki tähendama.</para>
<para>Regulaaravaldise rakendus ignoreerib paomärki, mis seisab sellise märgi ees, millel antud kontekstis ei ole eritähendust: näiteks längkriips võib <quote>j</quote> ees (<userinput>\j</userinput>) olla või mitte olla, mingit vahet ei ole. Kui sa ei tea täpselt, kas märgil võib olla eritähendus või mitte, on paomärgi kasutamine igati mõttekas.</para>
<para>Paomärki tasub kasutada mõistagi ka längkriipsu enda korral: kui just seda on vaja otsida-asendada, siis tulebki kirjutada <userinput>\\</userinput>.</para>
<para><emphasis>Märgiklass</emphasis> on avaldis, mis sobib teatud määratud märgikogumiga. Regulaaravaldiste puhul defineeritakse märgiklassid klassi kuuluvaid märke nurksulgudesse <literal>[]</literal> asetades või mõnda allpool kirjeldatud lühendatud klassi kasutades.</para>
<para>Lihtsad märgiklassid sisaldavad vaid ühe või enam literaalse märgi, näiteks <userinput>[abc]</userinput> (sobivad tähed <quote>a</quote>, <quote>b</quote> või <quote>c</quote>) või <userinput>[0123456789]</userinput> (sobib iga number).</para>
<para>Kuna tähtedel ja numbritel on loogiline järjekord, võib neid vahemikke määrates ka lühendada: <userinput>[a-c]</userinput> on sama, mis <userinput>[abc]</userinput> ja <userinput>[0-9]</userinput> on sama, mis <userinput>[0123456789]</userinput>. Täiesti võimalik on ka selliseid konstruktsioone kombineerida, näiteks <userinput>[a-fynot1-38]</userinput> (selle vastab mõistagi kas <quote>a</quote>,<quote>b</quote>,<quote>c</quote>,<quote>d</quote>, <quote>e</quote>,<quote>f</quote>,<quote>y</quote>,<quote>n</quote>,<quote>o</quote>,<quote>t</quote>, <quote>1</quote>,<quote>2</quote>,<quote>3</quote> või <quote>8</quote>).</para>
<para>Et suur- ja väiketähti käsitletakse erinevatena, siis tuleb tõstutundetu märgiklassi loomiseks, mis leiaks näiteks <quote>a</quote> ja <quote>b</quote>, kindlasti kirjutada <userinput>[aAbB]</userinput>.</para>
<para>Mõistagi on võimalik luua ka <quote>negatiivseid</quote> märgiklasse, kus sobib <quote>kõik, välja arvatud</quote>. Selleks tuleb klassi algusse asetada katus (<literal>^</literal>): </para>
<para><userinput>[^abc]</userinput> tähendab, et sobib iga märk, <emphasis>välja arvatud</emphasis> <quote>a</quote>, <quote>b</quote> või <quote>c</quote>.</para>
<para>Lisaks literaalsetele sümbolitele on elu ja töö hõlbustamiseks defineeritud ka teatud valik lühendeid: <variablelist>
<listitem><para>Sobib Unicode märk, mis vastab kuueteistkümnendnumbrile hhhh (vahemikus 0x0000 ja 0xFFFF). \0ooo (&ie; \null ooo) sobib <acronym>ASCII</acronym>/Latin-1 sümboliga, mis vastab kaheksandnumbrile 000 (vahemikus 0 ja 0377).</para></listitem>
<listitem><para>Sobib iga <quote>täheline märk</quote> - antud juhul siis suvaline täht või number. Arvesta, et alakriips <literal>_</literal> nende hulka ei käi erinevalt Perli regulaaravaldistest. Sama, mis <literal>[a-zA-Z0-9]</literal>.</para></listitem>
<listitem><para>Sobib iga mittetäheline märk - seega kõik, mis ei ole täht ega number. Sama, mis <literal>[^a-zA-Z0-9]</literal> või <literal>[^\w]</literal>.</para></listitem>
<para>Lühendatud klasse võib asetada tavalise klassi sisse, näiteks tähelise märgi, tühiku või punkti leidmiseks võib kirjutada <userinput>[\w \.]</userinput>.</para>
<para>Järgmistel märkidel on eritähendus, kui nad esinevad märgiklassi konstruktsiooni <quote>[]</quote> sees ja nad tuleb varustada paomärgiga, et neid võetaks literaalselt:</para>
<listitem><para>Märgiklassi lõpp. Vajalik on paomärk, kui see pole klassi kõige esimene märk (millele võib järgneda paomärgita katus).</para></listitem>
<listitem><para>Märgib negatiivset klassi, kui on esimene märk. Kui peab sobima literaalselt, on vajalik paomärk, kui on klassi esimene märk.</para></listitem>
<para>Alammustriga saab grupeerida alternatiivide valiku mustris. Alternatiivid tuleb eraldada püstkriipsuga <quote>|</quote>.</para>
<para>Et sobiks näiteks kas või üks sõnadest <quote>int</quote>, <quote>float</quote> or <quote>double</quote>, saab kasutada mustrit <userinput>int|float|double</userinput>. Kui soovid leida aga neist ühe vaid juhul, kui sellele järgneb üks või enam tühimärki ja siis veel mingid tähed, anna alternatiivid alammustrina: <userinput>(int|float|double)\s+\w+</userinput>.</para>
<title>Sobiva teksti haaramine (tagasiviited)</title>
<para>Kui soovid kasutada tagasiviidet, tarvita alammustrit, mis jätab meelde mustri soovitud osa.</para>
<para>Kui näiteks soovid leida ühe ja sama sõna kaks esinemist, mida eraldab koma ja võib-olla mõned tühimärgid, võid kirjutada <userinput>(\w+),\s*\1</userinput>. Alammuster <literal>\w+</literal> leiab täheliste märkide kogumi ning kogu avaldis sobib siis, kui sellele järgneb koma, 0 või enam tühimärki ja siis uuesti samasugune täheliste märkide kogum. (String <literal>\1</literal> viitab <emphasis>esimesele sulgudes alammustrile</emphasis>.)</para>
<!-- <para>See also <link linkend="backreferences">Back references</link>.</para> -->
<para>Ettevaatav eeldus on alammuster, mida alustab kas <literal>?=</literal> või <literal>?!</literal>.</para>
<para>Kui näiteks sobima peab literaalne string <quote>Bill</quote>, aga ainult juhul, kui sellele ei järgne <quote> Gates</quote>, võib kasutada sellist avaldist: <userinput>Bill(?! Gates)</userinput>. See leiab nii väljendid <quote>Bill Clinton</quote> kui ka <quote>Billy the Kid</quote>, aga ingoneerib muid sobivusi.</para>
<para>Eelduseks kasutatud alammustreid ei haarata.</para>
<para>Vaata ka osa <link linkend="assertions">Eeldused</link></para>
<para>Järgmistel märkidel on eritähendus, kui nad esinevad mustris, ning need tuleb varustada paomärgiga, kui neid peab võtma literaalselt: <variablelist>
<para><emphasis>Kvantorid</emphasis> lasevad regulaaravaldisel leida määratud arvu või arvuvahemiku märke, märgiklasse või alammustreid.</para>
<para>Kvantorid antakse looksulgudes (<literal>{</literal> ja <literal>}</literal>) ning nad esinevad üldistatult kujul <literal>{[minimaalselt-esinemisi][,[maksimaalselt-esinemisi]]}</literal> </para>
<para>Kasutamist selgitab kõige paremini näide: <variablelist>
<para>Kui kasutada kvantoreid ilma maksimumi määramata, otsib regulaaravaldis vaikimisi otsitavat stringi nii palju, kui vähegi võimalik, mida nimetatakse sageli <emphasis>ahneks</emphasis> käitumiseks.</para>
<para>Tänapäevased regulaaravaldiste rakendused pakuvad vahendeid <quote>ahnuse väljalülitamiseks</quote>, kuigi graafilises keskkonnas on jäänud liidese ülesandeks pakkuda sellist võimalust või mitte. Nii võib näiteks regulaaravaldise võimalusega otsingudialoogis olla märkekast <quote>Minimaalne sobivus</quote>, samuti võib see märku anda, kas ahnus on vaikimisi sisse lülitatud või mitte.</para>
<listitem><para>Sobivad arvud väljendites <quote>1234 läheb</quote> ja <quote>12345 nüüd</quote>, aga mitte väljendites <quote>567 üksteist</quote> või <quote>223459 kuskil</quote>.</para></listitem>
<listitem><para>Sobivad kõik väljendid <quote>blablabla</quote> ja <quote>bla</quote> väljendites <quote>blaster</quote> või <quote>kõbla</quote>.</para></listitem>
<para><emphasis>Eeldused</emphasis> võimaldavad leida regulaaravaldise sobivuse ainult teatud määratud tingimustel.</para>
<para>Eeldus ei otsi õigupoolest sobivat märki, vaid uurib lähikonnast võimalikke sobivusi, enne kui midagi omaks võtta. Näiteks <emphasis>sõnapiirde</emphasis> eeldus ei püüa leida mitte antud positsioonis mittetähelist märki, vaid kontrollib, et seal ei oleks tähelist märki. See tähendab, et eeldus sobbi, kui tegemist ei ole märgiga, &ie; tegemist on otsitava stringi alguse ja lõpuga.</para>
<para>Mõned eeldused ei otsi õigupoolest sobivat mustrit, vaid osa stringi sobivust, mis ei ole terve avaldise sobivuse tulemus.</para>
<para>Avaldisega <userinput>ju\?$</userinput> sobib stringi <quote>Sa ei teinud seda, eks ju?</quote>, aga mitte stringi <quote>Sa ei teinud seda, eks?</quote> lõpp.</para>
<listitem><para>Sobib, kui ühel pool on täheline märk ja teisel pool mittetäheline märk.</para>
<para>Sellest on abi konkreetsete sõnade leidmisel, eriti kui näiteks määrata kogu sõna sobivus. Avaldisega <userinput>\bjuures\b</userinput> sobib eraldiseisva sõnaga <quote>juures</quote> näiteks lauses <quote>Ta seisis akna juures vaikides</quote>, aga mitte näiteks sõnas <quote>juurestik</quote>.</para></listitem>
<listitem><para>Sobib kõikjal, kus <quote>\b</quote> ei sobi.</para>
<para>See tähendab, et sobivus asub sõna sees: avaldisega <userinput>\Bjuures\B</userinput> sobib <quote>alusjuurestik</quote>, aga mitte <quote>juurestik</quote> või <quote>sealjuures</quote>.</para>
<listitem><para>Ettevaatav eeldus uurib sobivuse leidmiseks selle järgnevat stringi. Positiivne ettevaade ei näita sobivust, kui võimalikule sobivusele järgnev tekst ei vasta eelduse <emphasis>MUSTRILE</emphasis>, vaid tekstile, mis sellega sobib, mida ei kaasata tulemusse.</para>
<para>Avaldisega <userinput>käsi(?=\w)</userinput> sobib <quote>käsi</quote> stringis <quote>käsitööline</quote>, aga mitte stringis <quote>See on meie neljas käsi!</quote>.</para>
<para>Avaldisega <userinput>const \w+\b(?!\s*&)</userinput> sobib <quote>const char</quote> in the string <quote>const char* foo</quote>, aga mitte <quote>const TQString</quote> stringis <quote>const TQString& bar</quote>, sest <quote>&</quote> sobib negatiivse ettevaatava eelduse mustriga.</para>