Reguljära uttryck

Reguljära uttryck (engelska: regular expressions) används för att söka efter mönster i text (och i vissa fall även göra ändringar). När ett sökmönster passar in på ett textavsnitt (t ex ett ord) säger man att mönstret matchar textavsnittet. Reguljära uttryck kan användas i editorer som vi, emacs och sed, ihop med kommandona grep, egrep och expr, liksom i många programspråk (Awk, C#, Java, Javascript, Perl, PHP, Python, Ruby, Tcl, VB.NET, Visual Basic m fl). Det finns också tilläggspaket (bibliotek) som gör det möjligt att använda reguljära uttryck ihop med andra programspråk (C/C++, Haskell m fl).

Reguljära uttryck bildas med hjälp av "vanliga" tecken och specialtecken (som ibland kallas metatecken). Tabellerna nedan redovisar de flesta specialtecknen, grupperade efter typ.

Observera: Vid användning av reguljära uttryck från kommandoraden måste ofta sökmönstren citeras och/eller föregås av bakåtstreck (\) för att förhindra att kommandotolken behandlar och expanderar dem som filnamnsmönster. Lägg märke till att vissa specialtecken kan förekomma i både reguljära uttryck och i filnamnsmönster, men att de då åtminstone delvis har olika betydelser.

Metatecken

Symbol Betydelse
^ Matchar radbörjan
$ Matchar radslut
. Matchar ett godtyckligt tecken (utom radslut)
* Matchar föregående tecken/mönster 0, 1 eller fler gånger.
Mönster bestående av flera tecken måste grupperas, t ex med parenteser
+ Matchar föregående tecken/mönster 1 eller fler gånger.
Mönster bestående av flera tecken måste grupperas, t ex med parenteser
? Matchar föregående tecken/mönster 0 eller 1 gång.
Mönster bestående av flera tecken måste grupperas, t ex med parenteser
| Matchar föregående eller efterföljande text/mönster (ab|ba matchar t ex "ab" eller "ba")

Parentesuttryck

Symbol Betydelse
() Grupperar mönster (används bl a ihop med sök/utbyt-operationer)
{n, m} Anger hur många gånger det som står till vänster ska matchas. Exempel:
{3} betyder att det ska matchas exakt 3 gånger,
{3,} att det ska matchas minst 3 gånger och
{2,4} att det ska matchas åtminstone 2 gånger och högst 4 gånger
[] Anger teckenmängd. Exempel:
[aei] matchar något av tecknen "a", "e" eller "i"
[a-e] matchar teckenintervallet "a"-"e", dvs någon av de 5 första bokstäverna i alfabetet
[^a-z] matchar alla tecken utom de små engelska bokstäverna

Anmärkning: Ihop med kommandot expr, liksom med editorerna sed och vi måste vanliga parenteser och krullparenteser föregås av bakåtsnedstreck (t ex \(hej\). Detta gäller även kommandot grep om inte alternativet -e givits.

Escapesekvenser

Symbol Betydelse
\ "Stänger av" specialbetydelsen hos det följande tecknet
(\$ anger t ex ett dollartecken) eller påbörjar en specialsekvens (se nedan)
\n n är en siffra (1-9) och representerar (i utbytesmönster) den sträng som matchar n:te parentesuttrycket, dvs uttrycket inneslutet i ()
\0nnn Matchar ett tecken med oktal ASCII-kod nnn
\A Matchar början av strängen
\b Matchar ordgräns
\B Matchar allt som inte är ordgräns
\cX Matchar styrtecknet Ctrl-X
\d Matchar ett siffertecken
\D Matchar allt som inte är en siffra
\e Escape-tecken
\E Avslutar \L- eller \U-sekvens (i utbytesmönster)
\f Sidframmatningstecken (Form Feed)
\G Matchar där senaste matchning slutade
\l Ändra nästa tecken till gemen (i utbytesmönster)
\L Ändra följande tecken till gemener tills en \E-sekvens påträffas (i utbytesmönster)
\n Nyradstecken
\Q Citera specialtecken utan att tolka dem som reguljärt uttryck tills en \E-sekvens påträffas (i utbytesmönster)
\r Vagnreturtecken
\s Matchar ett blankt (vitt) tecken (tabulerings-, mellanslags-, nyradstecken osv)
\S Matcha alla tecken utom blanka (vita) tecken
\t Tabuleringstecken
\u Ändra nästa tecken till versal (i utbytesmönster)
\U Ändra följande tecken till versaler tills en \E-sekvens påträffas (i utbytesmönster)
\v Vertikalt tabuleringstecken
\w Matchar ett ordtecken (siffror, bokstäver och understrykningstecken)
\W Matchar alla icke-ordtecken.
\xnn Matchar ett tecken med hexadecimal ASCII-kod nn
\Z Matchar slutet av strängen
\$ Dollartecken
\@ Snabel-a
\% Procenttecken

Teckenklasser

Teckenklasserna definieras av Posix-standarden, men symbolerna nedan har inte lika stor spridning som kategorierna ovan, dvs det faktum att ett visst program hanterar reguljära uttryck betyder inte nödvändigtvis att det även "förstår" teckenklasserna.

 
Symbol Betydelse
[:alnum:] Bokstav eller siffra (alfanumeriskt tecken)
[:alpha:] Bokstav (alfabetiskt tecken)
[:cntrl:] Icke-skrivbart tecken
[:digit:] Siffra
[:graph:] Skrivbart tecken (utom blankt tecken)
[:lower:] Liten bokstav
[:print:] Skrivbart tecken, inklusive blankt tecken
[:punct:] Skrivbart tecken utom blankt eller alfanumeriskt
[:space:] Blankt tecken (blanktecken, tabbtecken m fl)
[:upper:] Stor bokstav
[:xdigit:] Hexadecimal siffra (0-9 och A-F)


Exempel

Nedan exemplifieras användning av reguljära uttryck ihop med kommandot grep och i vi-editorn. De som är intresserade av användning av reguljära uttryck i olika programspråk (t ex perl och python), rekommenderas en titt på böcker om programmering som brukar innehålla rikligt med sådana exempel.

grep

Det vanliga grep-kommandot stödjer bara s k grundläggande ("basic") reguljära uttryck, vilka utgör en delmängd av de metatecken/parentesuttryck som redovisas ovan (OBS att tecknen ( ) { och } här måste föregås av \):

^ $ . * \( \) [ \{ \} \

Om man behöver utvidgade ("extended") reguljära uttryck:

| ^ $ . * + ? ( ) [ { } \

kan man tillgripa kommandot egrep (OBS att här sätts inte \ framför parenteserna). Reguljära uttryck som skrivs från kommandoraden bör dock alltid "skyddas" mot tolkning av skalet, vilket säkrast görs med apostrofer (citationstecken duger dock ofta). I annat fall riskeras felaktiga resultat, t ex tolkas då | som rörledning och inte som "eller".

grep 'Linu[xs]' *.txt Visa de rader som innehåller Linux eller Linus i .txt-filer
grep -c '^[ \t]*$' *.txt Visa antalet tomma och blanka rader i .txt-filer
ls -l | grep '^l' Visa symboliska länkar
ls -l | grep '^.......r-x' Visa vilka filer som "övriga" har läs- och exekveringsrätt på

De följande exemplen visar enbart sökmönstren och måste givetvis kompletteras med grep och ett filnamnsmönster eller rörledning för att ange var sökningen ska ske

'a..c' Rader som innehåller 'a', 2 godtyckliga tecken och sedan ett 'c'
'^.$' Rader som innehåller exakt ett tecken
'^\.' Rader som börjar på en punkt
'^\^.' Rader som inte börjar på en punkt
^1[0-3]' Rader som börjar på 10, 11, 12 och 13
'[A-Z][A-Z]*$' Rader som slutar på en eller flera engelska versaler
'^[[:upper:]]' Rader som börjar med en versal (även svenska om systemet inställt på detta)
'[aeiouyåäö]\{3,\}' Rader med minst 3 vokaler efter varandra
'4[0-9]\{5\}-[0-9]\{4\}'  Personnummer som börjar på 4 (40-talister)
'[[:digit:]]\{6\}-[[:digit:]]\{4\}'  Godtyckligt personnummer
'<\(.*\)>.*<\/\1>' HTML-taggar

Sök och byt i vi

De metatecken/parentesuttryck som kan användas i vi är

^ $ . * \( \) [ \ \< \>

Lägg märke till att här har tillkommit \< och \> som markerar början resp slut på ett ord (i sökmönster).

Dessutom används tecknet & i utbytesmönster för att representera alla matchade tecken, dvs den text som matchade sökmönstret återanvänds i utbytet. I exemplen nedan utförs sök/utbyt i hela filen.

:%g/^$/d Ta bort alla tomrader
:%s/^/rm /g Infoga 'rm ' i början på varje rad
:%s/.*/(&)/g Omslut alla rader med parenteser (& medför att hela raden återanvänds vid utbytet)
:%s/  */ /g Byt 2 eller fler blanka mot en blank
:%s/^\(1.\)/\15/g Infoga 5 efter andra siffran i de tal först på raden som börjar med 1 (12990 ändras t ex till 125990)
:%s/\<sto\>/hingst/g  Byt ut ordet sto mot hingst
:%s/^\<./\u&/g Ändra första bokstaven i alla ord först på raden till versal (stor bokstav)


Copyright © 2000 Martin Fahlgren

martin@1-1-7-46a.ghn.gbg.bostream.se

[Till början av dokumentet] [Till artikelförteckningen]