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
|