1
<appendix id="regular-expressions">
5
>&Anders.Lund; &Anders.Lund.mail;</author>
6
<othercredit role="translator"
14
>bald@starman.ee</email
18
>Tõlge eesti keelde</contrib
25
>Regulaaravaldised</title>
28
>See lisa tutvustab lühidalt, kuid loodetavasti piisavalt
29
üksikasjalikult <emphasis
30
>regulaaravaldiste</emphasis>
31
maailma. Siin on dokumenteeritud regulaaravaldisi nii, nagu
32
neid kasutab &kate;, mis ei ole päris sama ei sellega, kuidas
33
käsitleb regulaaravaldisi Perl, ega sellega, mida arvab nendest
45
>Regulaaravaldised</emphasis
46
> 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>
49
>Näide: oletame, et soovid leida tekstist lõigud, mille alguses seisaks nimi <quote
53
> ja millele järgneks verbi <quote
58
>Tavalise otsingu puhul alustaksid ilmselt esimese nime <quote
60
> otsimisega, millele järgneks <quote
63
>Henrik ütle</userinput
64
>, ning sobivuste otsimisel tuleks kõrvale heita need, mis ei seisa lõigu alguses, samuti need, kus <quote
66
> vasteks ei ole mitte <quote
70
>, mis sind huvitavad, vaid midagi muud. Ja siis tuleb seda kõike korrata järgmise nimega...</para>
73
>Regulaaravaldist kasutades saab selle ülesande sooritada üheainsa otsinguga ning märksa täpsemalt.</para>
76
>Selleks määravad regulaaravaldiswed üldistavad, kuid ometi üksikasjalikud reeglid sobiva stringi leidmiseks. Meie näiteks võiks seda sõnades väljendada nii: <quote
77
>Rida, mille alguses seisab kas <quote
81
> (millele võib järgneda kuni neli tühi- või tabeldusmärki), millele järgneb tühimärk, millele järgneb <quote
83
>, millele järgneb kas <quote
88
>. Ja regulaaravaldisena näeks see välja nii:</para
91
>^[ \t]{0,4}(Henrik|Pernilla) ütle(s|b)</userinput
95
>Toodud näites on kasutatud kõiki nelja moodsas regulaaravaldises kasutatavat põhimõtet, nimelt:</para>
117
>Avaldist alustav katus (<literal
119
>) on eeldus, olles õige ainult juhul, kui järgnev string asub tõesti rea alguses.</para>
125
>(Henrik|Pernilla) ütle(s|b)</literal
126
> on mustrid. Esimene on <emphasis
127
>märgiklass</emphasis
128
>, millele vastab kas tühik või (horisontaalne) tabeldusmärk, teine muster sisaldab kõigepealt alammustrit, millele vastab kas <literal
134
>, seejärel osa, millele vastab täpselt string <literal
136
>, ning lõpuks alammustrit, millele vastab kas <literal
147
> on kvantor, mis annab teada <quote
148
>kuskil 0 kuni 4 kaugusel eelmisest</quote
152
>Et regulaaravaldise rakendus, mis toetab <emphasis
153
>tagasiviiteid</emphasis
154
>, 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>
157
>Ühtekokku leiab avaldis sobivused sealt ja ainult sealt, kus me seda soovime.</para>
160
>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>
164
<sect1 id="regex-patterns">
170
>Mustrid koosnevad literaalsetest stringidest ja märgiklassides. Mustrid võivad sisaldada alammustreid, mis kujutavad endast sulgudes antud mustrit.</para>
177
>Nii mustrites kui märgiklassides on mõnel märgil eritähendus. Neile literaalse sobivuse leidmiseks tuleb nad spetsiaalselt märkida ehk <emphasis
178
>pakku päästa</emphasis
179
>, 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>
182
>Seda tehakse märgi ette längkriipsu asetades (<literal
188
>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
192
>) 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>
195
>Paomärki tasub kasutada mõistagi ka längkriipsu enda korral: kui just seda on vaja otsida-asendada, siis tulebki kirjutada <userinput
203
>Märgiklassid ja lühendid</title>
207
>Märgiklass</emphasis
208
> on avaldis, mis sobib teatud määratud märgikogumiga. Regulaaravaldiste puhul defineeritakse märgiklassid klassi kuuluvaid märke nurksulgudesse <literal
210
> asetades või mõnda allpool kirjeldatud lühendatud klassi kasutades.</para>
213
>Lihtsad märgiklassid sisaldavad vaid ühe või enam literaalse märgi, näiteks <userinput
215
> (sobivad tähed <quote
222
>[0123456789]</userinput
223
> (sobib iga number).</para>
226
>Kuna tähtedel ja numbritel on loogiline järjekord, võib neid vahemikke määrates ka lühendada: <userinput
228
> on sama, mis <userinput
232
> on sama, mis <userinput
233
>[0123456789]</userinput
234
>. Täiesti võimalik on ka selliseid konstruktsioone kombineerida, näiteks <userinput
235
>[a-fynot1-38]</userinput
236
> (selle vastab mõistagi kas <quote
267
>Et suur- ja väiketähti käsitletakse erinevatena, siis tuleb tõstutundetu märgiklassi loomiseks, mis leiaks näiteks <quote
271
>, kindlasti kirjutada <userinput
276
>Mõistagi on võimalik luua ka <quote
278
> märgiklasse, kus sobib <quote
279
>kõik, välja arvatud</quote
280
>. Selleks tuleb klassi algusse asetada katus (<literal
287
> tähendab, et sobib iga märk, <emphasis
288
>välja arvatud</emphasis
298
>Lisaks literaalsetele sümbolitele on elu ja töö hõlbustamiseks defineeritud ka teatud valik lühendeid: <variablelist>
309
> signaalimärk (BEL, 0x07).</para
322
> lehevahetusmärk (FF, 0x0C).</para
335
> reavahetusmärk (LF, 0x0A, Unixis uus rida).</para
348
> kelgu tagastamise märk (CR, 0x0D).</para
361
> horisontaalne tabeldusmärk (HT, 0x09).</para
374
> vertikaalne tabeldusmärk (VT, 0x0B).</para
385
>Sobib Unicode märk, mis vastab kuueteistkümnendnumbrile hhhh (vahemikus 0x0000 ja 0xFFFF). \0ooo (&ie; \null ooo) sobib <acronym
387
>/Latin-1 sümboliga, mis vastab kaheksandnumbrile 000 (vahemikus 0 ja 0377).</para
398
>Sobib suvaline märk (kaasa arvatud reavahetusmärk).</para
409
>Sobib arv. Sama, mis <literal
422
>Sobib mitte-arv. Sama , mis <literal
437
>Sobib tühimärk. Praktiliselt sama, mis <literal
450
>Sobib mitte-tühimärk. Praktiliselt sama, mis <literal
452
>, ja sama, mis <literal
466
>täheline märk</quote
467
> - antud juhul siis suvaline täht või number. Arvesta, et alakriips <literal
469
> nende hulka ei käi erinevalt Perli regulaaravaldistest. Sama, mis <literal
470
>[a-zA-Z0-9]</literal
482
>Sobib iga mittetäheline märk - seega kõik, mis ei ole täht ega number. Sama, mis <literal
483
>[^a-zA-Z0-9]</literal
496
>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
503
>POSIXi klasside notatsioon <userinput
504
>[:<klassi nimi>:]</userinput
505
> ei ole veel toetatud.</para
510
>Eritähendusega märgid märgiklassides</title>
513
>Järgmistel märkidel on eritähendus, kui nad esinevad märgiklassi konstruktsiooni <quote
515
> sees ja nad tuleb varustada paomärgiga, et neid võetaks literaalselt:</para>
525
>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
535
>Märgib negatiivset klassi, kui on esimene märk. Kui peab sobima literaalselt, on vajalik paomärk, kui on klassi esimene märk.</para
546
>Märgib loogilist vahemikku. Märgiklassis vajab alati paomärki.</para
553
> (längkriips)</term>
556
>Paomärk. Vajab alati paomärki.</para
569
>Alternatiivid: sobib <quote
574
>Kui soovid, et leitaks üks mitme alternatiivse mustri seast, võib alternatiivid eraldada vertikaalse kriipsuga <literal
579
>Näiteks selleks, et leida kas <quote
583
>, tuleks kirjutada <userinput
584
>John|Harry</userinput
596
>Alammustrid</emphasis
597
> on sulgudesse võetud mustrid, mida saab regulaaravaldistes mitmeti kasutada.</para>
602
>Alternatiivide määramine</title>
605
>Alammustriga saab grupeerida alternatiivide valiku mustris. Alternatiivid tuleb eraldada püstkriipsuga <quote
610
>Et sobiks näiteks kas või üks sõnadest <quote
616
>, saab kasutada mustrit <userinput
617
>int|float|double</userinput
618
>. 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
619
>(int|float|double)\s+\w+</userinput
627
>Sobiva teksti haaramine (tagasiviited)</title>
630
>Kui soovid kasutada tagasiviidet, tarvita alammustrit, mis jätab meelde mustri soovitud osa.</para>
633
>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
634
>(\w+),\s*\1</userinput
635
>. Alammuster <literal
637
> 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
640
>esimesele sulgudes alammustrile</emphasis
644
>See also <link linkend="backreferences"
645
>Back references</link
651
<sect3 id="lookahead-assertions">
653
>Ettevaatavad eeldused</title>
656
>Ettevaatav eeldus on alammuster, mida alustab kas <literal
663
>Kui näiteks sobima peab literaalne string <quote
665
>, aga ainult juhul, kui sellele ei järgne <quote
667
>, võib kasutada sellist avaldist: <userinput
668
>Bill(?! Gates)</userinput
669
>. See leiab nii väljendid <quote
672
>Billy the Kid</quote
673
>, aga ingoneerib muid sobivusi.</para>
676
>Eelduseks kasutatud alammustreid ei haarata.</para>
679
>Vaata ka osa <link linkend="assertions"
687
<sect2 id="special-characters-in-patterns">
689
>Eritähendusega märgid mustrites</title>
692
>Järgmistel märkidel on eritähendus, kui nad esinevad mustris, ning need tuleb varustada paomärgiga, kui neid peab võtma literaalselt: <variablelist>
698
> (längkriips)</term>
712
>Eeldab stringi algust.</para
723
>Eeldab stringi lõppu.</para
731
> (vasak- ja parempoolne sulg)</term>
734
>Märgib alammustreid.</para
742
> (vasak- ja parempoolne looksulg)</term>
745
>Märgib numbrilisi kvantoreid.</para
753
> (vasak- ja parempoolne nurksulg)</term>
756
>Märgib märgiklasse.</para
764
> (püstkriips)</term>
767
>Loogiline VÕI. Eraldab alternatiive.</para
778
>Kvantor 1 või enam.</para
789
>Kvantor 0 või enam.</para
800
>Lisamärk, mida võib tõlgendada kvantorina 0 või 1.</para
812
<sect1 id="quantifiers">
819
> lasevad regulaaravaldisel leida määratud arvu või arvuvahemiku märke, märgiklasse või alammustreid.</para>
822
>Kvantorid antakse looksulgudes (<literal
826
>) ning nad esinevad üldistatult kujul <literal
827
>{[minimaalselt-esinemisi][,[maksimaalselt-esinemisi]]}</literal
831
>Kasutamist selgitab kõige paremini näide: <variablelist>
840
>Täpselt 1 esinemine.</para
851
>Null või 1 esinemine.</para
862
>Sama, aga üks märk vähem kirjutada:-)</para
873
>Vähemalt 5, aga maksimaalselt 10 esinemist.</para
884
>Vähemalt viis esinemist, maksimum puudub.</para
893
>Lisaks saab kasutada mõningaid lühendeid: <variablelist>
904
>, leiab suvalise arvu esnemisi.</para
917
>, vähemalt 1 esinemine.</para
930
>, null või 1 esinemine.</para
944
>Kui kasutada kvantoreid ilma maksimumi määramata, otsib regulaaravaldis vaikimisi otsitavat stringi nii palju, kui vähegi võimalik, mida nimetatakse sageli <emphasis
946
> käitumiseks.</para>
949
>Tänapäevased regulaaravaldiste rakendused pakuvad vahendeid <quote
950
>ahnuse väljalülitamiseks</quote
951
>, 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
952
>Minimaalne sobivus</quote
953
>, samuti võib see märku anda, kas ahnus on vaikimisi sisse lülitatud või mitte.</para>
962
>Mõned näited kvantorite kasutamise kohta.</para>
969
>^\d{4,5}\s</userinput
973
>Sobivad arvud väljendites <quote
977
>, aga mitte väljendites <quote
980
>223459 kuskil</quote
992
>Sobib üks või enam tühimärki.</para
999
>(bla){1,}</userinput
1003
>Sobivad kõik väljendid <quote
1007
> väljendites <quote
1025
><closeditem/></quote
1029
><openitem></quote
1040
<sect1 id="assertions">
1047
> võimaldavad leida regulaaravaldise sobivuse ainult teatud määratud tingimustel.</para>
1050
>Eeldus ei otsi õigupoolest sobivat märki, vaid uurib lähikonnast võimalikke sobivusi, enne kui midagi omaks võtta. Näiteks <emphasis
1051
>sõnapiirde</emphasis
1052
> 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>
1055
>Mõned eeldused ei otsi õigupoolest sobivat mustrit, vaid osa stringi sobivust, mis ei ole terve avaldise sobivuse tulemus.</para>
1058
>Siin dokumenteeritud regulaaravaldised toetavad järgmisi eeldusi: <variablelist>
1065
> (katus: stringi algus)</term
1069
>Sobib otsitava stringi algus.</para
1071
>Avaldisega <userinput
1077
>, aga mitte stringis <quote
1078
>Hei, Peeter!</quote
1087
> (stringi lõpp)</term>
1090
>Sobib otsitava stringi lõpp.</para>
1093
>Avaldisega <userinput
1095
> sobib stringi <quote
1096
>Sa ei teinud seda, eks ju?</quote
1097
>, aga mitte stringi <quote
1098
>Sa ei teinud seda, eks?</quote
1108
> (sõnapiire)</term>
1111
>Sobib, kui ühel pool on täheline märk ja teisel pool mittetäheline märk.</para>
1113
>Sellest on abi konkreetsete sõnade leidmisel, eriti kui näiteks määrata kogu sõna sobivus. Avaldisega <userinput
1114
>\bjuures\b</userinput
1115
> sobib eraldiseisva sõnaga <quote
1117
> näiteks lauses <quote
1118
>Ta seisis akna juures vaikides</quote
1119
>, aga mitte näiteks sõnas <quote
1130
> (mitte-sõnapiire)</term>
1133
>Sobib kõikjal, kus <quote
1137
>See tähendab, et sobivus asub sõna sees: avaldisega <userinput
1138
>\Bjuures\B</userinput
1140
>alusjuurestik</quote
1152
>(?=MUSTER)</userinput
1153
> (positiivne ettevaade)</term>
1156
>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
1158
>, vaid tekstile, mis sellega sobib, mida ei kaasata tulemusse.</para>
1160
>Avaldisega <userinput
1161
>käsi(?=\w)</userinput
1166
>, aga mitte stringis <quote
1167
>See on meie neljas käsi!</quote
1175
>(?!MUSTER)</userinput
1176
> (negatiivne ettevaade)</term>
1180
>Negatiivne ettevaade ei näita sobivust, kui otsitavale stringile järgnev osa ei vasta <emphasis
1184
>Avaldisega <userinput
1185
>const \w+\b(?!\s*&)</userinput
1188
> in the string <quote
1189
>const char* foo</quote
1191
>const QString</quote
1193
>const QString& bar</quote
1196
> sobib negatiivse ettevaatava eelduse mustriga.</para>
1206
<!-- TODO sect1 id="backreferences">
1209
>Back References</title>