Regulaaravaldised: erinevus redaktsioonide vahel

Allikas: Kuutõrvaja
Mine navigeerimisribaleMine otsikasti
Imre (arutelu | kaastöö)
Erkko (arutelu | kaastöö)
P omavigaparandus
 
(ei näidata 2 kasutaja 2 vahepealset redaktsiooni)
5. rida: 5. rida:
Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest.
Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest.


Toome lihtsa näite. Olgu fail kalastus sellise sisuga
Toome lihtsa näite - fail kalastus:


  bash$ cat kalastus
  bash$ cat kalastus
24. rida: 24. rida:
Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.).
Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.).


Regulaaravaldisite oskuslik kasutamine on oluline muuhulgas selliste programmide nagu Sed, Awk ja Procmail puhul.
Regulaaravaldiste oskuslik kasutamine on oluline muuhulgas selliste programmide nagu Sed, Awk ja Procmail puhul.


===Literaalsed - ja metasümbolid===
===Literaalsed - ja metasümbolid===
41. rida: 41. rida:
* . - punkt: suvaline üks sümbol
* . - punkt: suvaline üks sümbol
* * - tärn: suvaline arv, sh 0 temast vasakule jäävat sümbolit
* * - tärn: suvaline arv, sh 0 temast vasakule jäävat sümbolit
* [...] - klass: üks vahel olevatest sümbolitest
* [...] - klass: üks kantsulgude vahel olevatest sümbolitest
* ^ - katus: rea algus
* ^ - katus: rea algus
* $ - dollar: rea lõpp
* $ - dollar: rea lõpp
* \ - tagurpidi kaldkriips: põgeb talle järgneva metasümboli.  
* \ - tagurpidi kaldkriips: varjestab talle järgneva metasümboli.  


Järgnevad näited sellise teksti alusel:
Järgnevad näited sellise teksti alusel:
50. rida: 50. rida:
  bash~$ cat kohad
  bash~$ cat kohad
  Tartu 1437
  Tartu 1437
  Helsinkki 1960
  Helsinki 1960
  Yellowstone 1903
  Yellowstone 1903
  Tokio 1990
  Tokio 1990
56. rida: 56. rida:
  Pariis 1500
  Pariis 1500


Püüame kinni kõik kahekümnenda sajandi aastaarvud:
Kahekümnenda sajandi aastaarvud:


  bash~$ egerp "19.." kohad
  bash~$ egerp "19.." kohad


Püüame kinni kõik read
Kõik read


  bash~$ egrep ".*" kohad
  bash~$ egrep ".*" kohad


Püüame kinni kõik i või e lõpuliste kohanimedega read:
Kõik i või e -lõpuliste kohanimedega read:


  bash~$ grep "[ie] " kohad
  bash~$ grep "[ie] " kohad


Püüame kinni kõik mitte i või e lõpuliste kohanimedega read:
Kõik read kus kohanimi ei lõppe i või e tähega:


  bash~$ grep "[^ie] " kohad
  bash~$ grep "[^ie] " kohad
74. rida: 74. rida:
Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e.
Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e.


Püüame kinni T -ga algavad viietähelise kohanimega read:
T -ga algavad viietähelise kohanimega read:


  bash~$ egrep "^T.... " kohad
  bash~$ egrep "^T.... " kohad


Püüame kinni sajandivahetusele vastavad kohad:
Sajandivahetusele vastavad kohad:


  bash~$ egrep "00$" kohad
  bash~$ egrep "00$" kohad


Püüame kinni read, milles esineb sümbol "^", kui ta esineks:
Read, milles esineb sümbol "^":


  bash~$ egrep "\^" kohad
  bash~$ egrep "\^" kohad
90. rida: 90. rida:
Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid:
Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid:


    * + - pluss: üks või enam vasakul olevad sümbolit
* + - pluss: üks või enam temast vasakul olevat sümbolit
    * ? - küsimärk: null või üks vasakul olevat sümbolit
* ? - küsimärk: null või üks temast vasakul olevat sümbolit
    * | - toru: eelnev või järgnev regulaaravaldis
* | - toru: eelnev või järgnev regulaaravaldis
    * () - sulud: grupeerib regulaaravaldisi
* () - sulud: grupeerib regulaaravaldisi
    * {n,m} - loogad: mitu eelnevat sümbolit  
* {n,m} - loogad: mitu eelnevat sümbolit  


Näited eelpool toodud teksti alusel:
Näited eelpool toodud teksti alusel:
Püüme kinni kõik selle sajandile vastavad e'ga lõppevad kohanimed:
Kõik selle sajandile vastavad e -ga lõppevad kohanimed:


  bash~$ egrep "e +19" kohad
  bash~$ egrep "e +19" kohad


Võib olla kirjutatud kokku või sidekriipsuga:
Kohanimi võib olla kirjutatud kokku või sisaldada sidekriipsu:


  bash~$ egrep "Jää-?äär" kohad
  bash~$ egrep "Jää-?äär" kohad
127. rida: 127. rida:
  bash~$ egrep -E "a{4}" kohad
  bash~$ egrep -E "a{4}" kohad


Vähem kui neli 'a' -d, sh. null tükki:
Null kuni neli 'a' -d:


  bash~$ egrep -E "a{,4}" kohad
  bash~$ egrep -E "a{,4}" kohad
===Perl sarnaste avaldiste kasutamine===
Logist sarnase rea tabamiseks
Jan 10 23:49:46 post-relay postfix/smtp[15560]: 5A9CA5FD4E: to=<imre@auul.pri.ee> ...
sobib öelda nt
$ grep -P "postfix/smtp\[[0-9]+\]: [0-9,A-Z]+:" /var/log/mail.log


===Mõned regexpi mustrid===
===Mõned regexpi mustrid===
145. rida: 155. rida:
  [0-9]+ - vähemalt 1 number  
  [0-9]+ - vähemalt 1 number  


Nt rida httpd logist
Rida httpd logist


  OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds"  
  OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds"  


Selle analoogia põhjal proovi sellist:
Selle analoogia põhjal proovi avaldist:


  "output:tm:/- (\\d+) bytes/" "output:tma:/in =  (\\d+\\.?\\d*) seconds/"
  "output:tm:/- (\\d+) bytes/" "output:tma:/in =  (\\d+\\.?\\d*) seconds/"


Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt escapeda, ehk \\, millest võis minu esialgne rida mitte töötada. Teine asi on nende sulgudega - sulgude sees olev regexi osa on see, mis pannakse väljundisse, seega peab sulge õigesti panema.
Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt varjestada, ehk \\, millest võis minu esialgne rida mitte töötada. Teine asi on nende sulgudega - sulgude sees olev regexi osa on see, mis pannakse väljundisse, seega peab sulge õigesti panema.


===Kasulikud lisamaterjalid===
===Kasulikud lisamaterjalid===

Viimane redaktsioon: 29. detsember 2025, kell 02:56

Regulaaravaldised

Regulaaravaldis on kontrolleeskiri, mida rakendatakse mingile tekstile. Iga teksti jaoks antakse vastus, kas tekst klappis avaldisega või mitte.

Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest.

Toome lihtsa näite - fail kalastus:

bash$ cat kalastus
tegelane    kalade arv
Priit_______1
Mart_______12
Peeter_____45
Konstant___34
Tibu________3
Miima______12

Eraldame välja read, kus on kalade arv alla kümne. See tähendab, rea lõpus asuv kalade arv on pandud kirja ühe märgiga.

bash$ egrep "_.$" kalastus
Priit_______1
Tibu________3

Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.).

Regulaaravaldiste oskuslik kasutamine on oluline muuhulgas selliste programmide nagu Sed, Awk ja Procmail puhul.

Literaalsed - ja metasümbolid

Regulaaravaldis "_.$" sisaldab kahte sorti sümboleid:

  • literaalsed - need, mis ise esinevad vaatlusaluses tekstis, nagu alakriips
  • metasümbolid - "." kohal võib olla üks suvaline tähemärk; "$" tähistab rea lõppu.

Regulaaravaldised võeti algselt kasutusele programmis Ed, millest kasvasid välja Grep ja Sed. Piiratud metasümbolite arv, mida nimetatakse traditsiooniliseks metasümbolite hulgaks, tingis laiendatud metasümbolite hulga (ingl. k. extended metacharacters set) kasutuselevõtu. Laiendatud hulka oskavad kasutada Awk ja Egrep.

Aritmeetiliste avaldiste juures on olulised tehtemärgid. Regulaaravaldistes on põhiliseks teheteks sümbolite kõrvutiolek.

Traditsioonilised metasümbolid

  • . - punkt: suvaline üks sümbol
  • * - tärn: suvaline arv, sh 0 temast vasakule jäävat sümbolit
  • [...] - klass: üks kantsulgude vahel olevatest sümbolitest
  • ^ - katus: rea algus
  • $ - dollar: rea lõpp
  • \ - tagurpidi kaldkriips: varjestab talle järgneva metasümboli.

Järgnevad näited sellise teksti alusel:

bash~$ cat kohad
Tartu 1437
Helsinki 1960
Yellowstone 1903
Tokio 1990
Praha 1400
Pariis 1500

Kahekümnenda sajandi aastaarvud:

bash~$ egerp "19.." kohad

Kõik read

bash~$ egrep ".*" kohad

Kõik i või e -lõpuliste kohanimedega read:

bash~$ grep "[ie] " kohad

Kõik read kus kohanimi ei lõppe i või e tähega:

bash~$ grep "[^ie] " kohad

Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e.

T -ga algavad viietähelise kohanimega read:

bash~$ egrep "^T.... " kohad

Sajandivahetusele vastavad kohad:

bash~$ egrep "00$" kohad

Read, milles esineb sümbol "^":

bash~$ egrep "\^" kohad

Laiendatud metasümbolite kirjeldused

Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid:

  • + - pluss: üks või enam temast vasakul olevat sümbolit
  • ? - küsimärk: null või üks temast vasakul olevat sümbolit
  • | - toru: eelnev või järgnev regulaaravaldis
  • () - sulud: grupeerib regulaaravaldisi
  • {n,m} - loogad: mitu eelnevat sümbolit

Näited eelpool toodud teksti alusel: Kõik selle sajandile vastavad e -ga lõppevad kohanimed:

bash~$ egrep "e +19" kohad

Kohanimi võib olla kirjutatud kokku või sisaldada sidekriipsu:

bash~$ egrep "Jää-?äär" kohad

Võib alata C või K'ga:

bash~$ egrep "K|Columbia" kohad

Kui tavaliselt toimivad metasümbolid ühele eelnevale või järgnevale märgile, siis sulgudega on võimalik nad panna toimima mitmele:

bash~$ egrep "(Columbia)|(Kolumbia)" kohad

Võimalik on näidata, mitu sümbolit lähevad arvesse:

Neli kuni seitse 'a' -d:

bash~$ egrep -E "a{4,7}" kohad

Neli või enam 'a' -d:

bash~$ egrep -E "a{4,}" kohad

Täpselt neli 'a' -d:

bash~$ egrep -E "a{4}" kohad

Null kuni neli 'a' -d:

bash~$ egrep -E "a{,4}" kohad

Perl sarnaste avaldiste kasutamine

Logist sarnase rea tabamiseks

Jan 10 23:49:46 post-relay postfix/smtp[15560]: 5A9CA5FD4E: to=<imre@auul.pri.ee> ...

sobib öelda nt

$ grep -P "postfix/smtp\[[0-9]+\]: [0-9,A-Z]+:" /var/log/mail.log

Mõned regexpi mustrid

as 112233 sdf
asd 0.0232 ads
Muster:
\s(0\.)?[0-9]+\s

Selgitus:

\s - tühik
(0\.)? - luba numbrijada ees 0.
[0-9]+ - vähemalt 1 number 

Rida httpd logist

OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds" 

Selle analoogia põhjal proovi avaldist:

"output:tm:/- (\\d+) bytes/" "output:tma:/in =  (\\d+\\.?\\d*) seconds/"

Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt varjestada, ehk \\, millest võis minu esialgne rida mitte töötada. Teine asi on nende sulgudega - sulgude sees olev regexi osa on see, mis pannakse väljundisse, seega peab sulge õigesti panema.

Kasulikud lisamaterjalid

© EENet 2000