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.
| 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") |
| 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.
| 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 |
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) |
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.
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 |
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