Säännölliset lausekkeet Perlissä
Mureakuha
Perl-kieli on erityisesti suunniteltu tiedon käsittelyyn. Siinä on tärkeässä osassa säännölliset lausekkeet (regular expressions). Perlin säännölliset lausekkeet otettiin alun perin Unixista, mutta ne erosivat siitä jo ennen Perlin ensimmäistä julkaisua.
Sisällysluettelo |
Alkuun
Perlissä merkkijonoja korvataan s///-operaattorilla ja niitä etsitään m//-operaattorilla. Näiden operaattoreiden toimintaa voi muuttaa muuttajilla. Seuraavassa koodinpätkässä on tarkoitus korvata kaikki "i"-kirjaimet "a"-kirjaimella.
#!/usr/bin/perl -w use strict; $\ = "\n"; $_ = "Suomessa on kiva asua!"; s/i/a/; print;
Koodissa on vain se ongelma, että se, että se ei muuta kuin ensimmäisen pienen s-kirjaimen. Eli pistetään sinne kaksi muuttajaa, jotka korjaavat ongelman.
g, eli global, korvaa kaikki esiintymät, ei vain ensimmäistä.
i, eli case-insensitive, kirjainten koolla ei ole väliä.
#!/usr/bin/perl -w use strict; $\ = "\n"; $_ = "Suomessa on kiva asua!"; s/i/a/gi; print;
Tämä koodi tulostaa "Suomessa on kava asua!"
Erityismerkit
| Erityismerkki | Selitys |
|---|---|
|
. |
Mikä tahansa yksi merkki, paitsi rivinvaihto ('m'-valitsimen kanssa . osuu myös rivinvaihtoon) |
|
\ |
Seuraava |
|
[xyz] |
Mikä tahansa kirjaimista x, y ja z |
|
[^xyz] |
Mikä tahansa merkki paitsi x, y tai z |
|
\n |
Rivinvaihto, newline |
|
\t |
Sisennys, tabulator |
|
\s, \S |
"Tyhjä" merkki: välilyönti, rivinvaihto (\n), sarkain (\t), mikä tahansa muu kuin tyhjä merkki |
|
\d, \D |
\d=numero, \D=mikä tahansa paitsi numero |
|
\w, \W |
Kirjain [a-zA-Z0-9_], ei kirjain [^a-zA-Z0-9_] (huom! merkistöstä riippuen sisältö vaihtelee) |
|
(foo) |
Ryhmittely |
|
? |
0 tai 1 kertaa, sama kuin {0,1} |
|
+ |
1 tai 1 enemmän, sama kuin {1,} |
|
* |
0 tai enemmän, sama kuin {0,} |
Ryhmät
Merkkijonoja ryhmitellään tavallisilla sulkeilla. Kaikki mitä on sulkeiden välissä otetaan talteen. Talteen otetut merkkijonot löytyvät muuttujista: $1, $2, $3 ...
Parsitaan kellonaika merkkijonosta.
#!/usr/bin/perl -w use strict; $\ = "\n"; my $str = "kello on 14:56:03."; # tavallinen merkkijonon etsiminen $str =~ m/(\d{2}:\d{2}:(\d{2}))/; print "Ensimmäinen ryhmä: $1"; print "Toinen ryhmä: $2";
Koodista saa vähän selvempää käyttämällä x-modifieria, jolloin regexin sekaan voi kirjoittaa välilyöntejä ja kommentteja.
#!/usr/bin/perl -w use strict; $\ = "\n"; my $str = "kello on 14:56:03."; # tavallinen merkkijonon etsiminen $str =~ m/ ( # ensimmäinen ryhmä alkaa \d{2}: # tunnit \d{2}: # minuutit ( # sekunnit omaan ryhmään \d{2} # kaksi numeroa ) # toinen ryhmä loppuu )/x; print "Ensimmäinen ryhmä: $1"; print "Toinen ryhmä: $2";
Koodi tulostaa:
Ensimmäinen ryhmä: 14:56:03 Toinen ryhmä: 03
Tässä oletetaan, että kellonajassa on jokaisessa kohdassa kaksi numeroa ( \d{2} ), joten 14:56:3 ei mene läpi.
Ryhmät voivat sisältää toisia ryhmiä ja niitä voi olla lähes rajoittamaton määrä.
Säännöllisen lausekkeen talteenotetut ryhmät löytyvät siis numeroiduista muuttujista $1..$n, mutta voit käyttää ryhmiä myös saman s//-lausekkeen korvausosassa:
$_ = "etunimi:masa sukunimi:niemi"; s/:(\S+)/\1 /g; print;
tulostaa: masa niemi
Ryhmän voi luoda myös ottamatta sitä muistiin:
$_ = '<div class="main">'; m/(?:class=")(\S+)"/; print "Elementin luokka oli: $1";
tulostaa: Elementin luokka oli: main
