Säännölliset lausekkeet (regular expressions)


Johdanto, Käytettävät merkinnät, Esimerkkejä, Missä näitä käytetään

Johdanto

Säännölliset lausekkeet (regular expressions, regexp) ovat eräänlainen kielioppi, jolla voidaan määritellä ehtoja merkkijonojen muodostumiselle erilaisissa hakutilanteissa. Esimerkeissä käytetään grep- ja egrep-nimisiä ohjelmia, jotka hakevat tekstitiedostosta rivejä, jotka täyttävät annetut ehdot.


Käytettävät merkinnät

Säännöllisissä lausekkeissa voidaan käyttää seuraavia merkintöjä. Perusmerkinnät ovat seuraavat:

merkkijono Merkkijonon "merkkijono" pitää esiintyä juuri sellaisenaan haettavassa paikassa
[abc] Jokin merkeistä a, b tai c tulee esiintyä tuossa kohdassa. (Vrt. jokerimerkit)
[^abc] Mikä tahansa muu merkki paitsi luetellut
[a-z] Mikä tahansa pieni kirjain. Huomaa, ettei kirjaimiksi yleensä lasketa kuin kirjaimet a-z. Skandimerkit lasketaan yleensä erikoismerkeiksi.
. Piste tarkoittaa mitä tahansa merkkiä
* Edeltävä merkki saa toistua 0-n kertaa. Esimerkiksi ab*a-merkintä tarkoittaa esim. merkkijonoja aa, aba, abba, abbbbbbba, jne...
^ Hattumerkki kiinnittää haun rivin alkuun.
$ Taalamerkki sitoo haun rivin loppuun.
\ Peittää erikoismerkityksen, jos pitää hakea merkkiä, jolla on erikoismerkitys

Seuraavia kutsutaan usein ns. laajennetuiksi merkinnöiksi:

+ Kuten edellä, mutta merkkejä pitää olla vähintään yksi.
? Edeltävä merkki on optionaalinen (voi olla, että on, voi olla ettei)
a|b Esiintyy joko merkki 'a' tai merkki 'b'
(abcd) Suluilla ryhmitellään merkkejä. (abcd)|(efgh) tarkoittaa, että kohdassa on joko merkkijono "abcd" tai "efgh".
{N} Haettu merkki toistuu täsmälleen N kertaa: esim. ab{5}a tarkoittaa täsmälleen viittä b-kirjainta kahden a-kirjaimen välissä.
{N,} Kuten edellä, mutta merkki esiintyy vähintään N kertaa
{N,M} Merkki esiintyy N-M kertaa
\< Sitoo etsinnän sanan alkuun.
\> Sitoo etsinnän sanan loppuun

Näiden toiminnan osaa monet eri ohjelmat, kuten grep, egrep, sed, perl, emacs, awk,... Mitä sitten mikäkin ohjelma todellisuudessa hallitsee, onkin eri juttu. Siitä voidaan lähteä, että perusmerkit osaa käytännössä jokainen säännöllisten lausekkeiden toiminnan hallitseva ohjelma. Esimerkiksi tämän linkin takaa löytyy taulukko, jossa on hieman kuvattu sitä, mitä mikäkin ohjelma hallitsee. Tämäkään ei ole kovin kattava lista.


Esimerkkejä

Osaa esimerkeistä voi kokeilla seuraavan esimerkkitiedoston avulla: (esimerkeissä tiedosto on nimeltään file)

	
Kenonen Eenokki     Kuusitie 6    66666 kuusikko
Kukkanen Hilma      Mäkitie 5     00100 hki
Näsä Matti          Morokatu 1    12344 hki
Silakka Timo        Katutie 3     00500 hki
Vormisto Raimo      Tiekatu 4     00300 hki
Mäsä Lauri          Juurakkotie 1 00530 hki
Keinonen Mölli      Pitsitie 11   55555 rauma
Ahkio Arja          Viisitie 6    02000 epsoo
Uunola Unto         Kaikukuja     00530 helsinki
Punenius Milla      Muuttokatu 23 00100 nummela

 

grep 'kalle' /etc/passwd Etsii käyttäjän nimeltään "kalle" tiedostosta /etc/passwd (tarkkaanottaen kaikki rivit, joilla esiintyy merkkijono "kalle")
grep '[Nn]äsä' /etc/passwd Etsii /etc/passwd-tiedostosta merkkijonoa "näsä", joka saa alkaa joko isolla tai pienellä kirjaimella.
grep 'hki' file Hakee tiedostosta "file" kaikki rivit, joilla on merkkijono "hki"
grep 'hki$' file Hakee ne rivit, jotka päättyvät merkkijonon "hki".
grep '^.äsä' file Hakee rivin alusta merkkijonot, jotka alkavat millä tahansa kirjaimella, mutta kirjainta seuraa "äsä".
grep 'h.*ki$' file Hakee rivit, joiden lopussa on sana, joka alkaa h-kirjaimella ja päättyy ki-kirjaimiin. Välissä voi olla sitten mitä tahansa merkkejä.
grep '^nen\>' file Hakee sellaiset rivit, joissa ensimmäinen sana rivillä päättyy "nen".
egrep '[kt]{2}' file Hakee rivit, joilla esiintyy kaksi peräkkäistä k- tai t-kirjainta.

Missä näitä käytetään?

Säännöllisiä lausekkeita käyttävät useat ohjelmat, joiden avulla voidaan käsitellä tekstitiedostoja. Esimerkkejä näistä ohjelmista ovat esim. seuraavat:

grep Hakee rivejä tekstitiedostosta
egrep, fgrep Edellisen variaatioita. egrep = extended grep. Osaa laajemman valikoiman säännöllisiä lausekkeita. fgrep = fast grep, eli nopea grep. Fgrep käsittää kaikki merkit ja merkkiyhdistelmät "tavallisina" merkkijonoina. Esim. fgrep 'taala$' teksti etsii rivejä, joilla on teksti "taala$"
sed Stream editor. Tällä voi mm. etsiä ja korvata merkkijonoja tiedostosta. Toimii myös useiden ohjelmien yhteydessä, esim vi:n
emacs Editori. Erittäin laaja ja monipuolinen.
awk Sarakemuotoisen datan käsittelyyn erittäin tehokas ns. pieni ohjelmointikieli.
perl ohjelmointikieli

Alkuun