Mönster

Mönster består av vanliga strängar och teckenklasser. Mönster kan innehålla delmönster, vilket är mönster som är inneslutna i parenteser.

Undanta tecken

I mönster och teckenklasser har vissa tecken en särskilt mening. För att uttryckligen matcha något av de här tecknen, måste de markeras eller undantas för att tala om för programvaran för reguljära uttryck att den ska tolka sådana tecken uttryckligen.

Det här görs genom att lägga till ett bakstreck (\) före tecknet.

Programvaran för reguljära uttryck ignorerar tecken som undantas även om de inte har någon särskild betydelse i sammanhanget, så att undanta till exempel ett j (\j) är säkert. Om du är tveksam om ett tecken kan ha en särskild betydelse, kan du därför alltid undanta det på ett säkert sätt.

Undantag omfattar förstås också bakstrecket själv, för att uttryckligen matcha ett sådant, skulle du skriva \\.

Teckenklasser och förkortningar

En teckenklass är ett uttryck som matchar ett tecken i en mängd angivna tecken. I reguljära uttryck definieras teckenklasser genom att ange de giltiga tecknen i klassen inom hakparenterser, [], eller genom att använda en av de förkortade klasserna som beskrivs nedan.

Enkla teckenklasser innehåller bara uttryckligen ett eller flera tecken, till exempel [abc] (som matchar något av tecknen a, b eller c) eller [0123456789] (som matchar alla siffror).

Eftersom bokstäver och siffror har en logisk ordning, kan du förkorta dem genom att ange intervall: [a-c] är samma sak som [abc] och [0-9] är samma sak som [0123456789]. Att kombineras dessa sammansättningar, till exempel med [a-fynot1-38] är fullständigt riktigt (detta skulle förstås matcha antingen a,b,c,d, e,f,y,n,o,t, 1,2,3 eller 8).

Eftersom stora bokstäver är andra tecken än motsvarande små bokstäver, så måste du alltså skriva [aAbB], för att skapa en teckenklass som matchar både de små och stora bokstäverna a eller b.

Det är förstås möjligt att skapa en negativ klass som matchar allting utom. För att göra detta lägg till en hatt (^) först i klassen:

[^abc] matchar alla tecken utom a, b eller c.

Förutom uttryckliga tecken, definieras några förkortningar, som gör livet lite enklare:

\a

Det här matchar ASCII-tecknet BEL (0x07).

\f

Det här matchar ASCII-tecknet ny sida (FF, 0x0C).

\n

Det här matchar ASCII-tecknet nyrad (LF, 0x0A, Unix nyrad).

\r

Det här matchar ASCII returtecken (CR, 0x0D).

\t

Det här matchar ASCII-tecknet horisontell tabulator (HT, 0x09).

\v

Det här matchar ASCII-tecknet vertikal tabulator (VT, 0x0B).

\xhhhh

Det här matchar Unicode-tecknet som motsvarar det hexadecimala värdet hhhh (mellan 0x0000 och 0xFFFF). \0ooo (dvs. \noll ooo) matchar ASCII/Latin-1 tecknet som motsvarar det oktala värdet ooo (mellan 0 och 0377).

. (punkt)

Det här matchar vilket tecken som helst (inklusive nyrad).

\d

Det här matchar en siffra. Samma som [0-9].

\D

Det här matchar allt utom en siffra. Samma som [^0-9] eller [^\d].

\s

Det här matchar ett blanktecken. Nästan samma sak som [ \t\n\r].

\S

Det här matchar allt utom ett blanktecken. Nästan samma sak som [^ \t\r\n], och samma som [^\s].

\w

Matchar alla ord-tecken - i det här fallet alla bokstäver, siffror eller understreck. Samma som [a-zA-Z0-9_].

\W

Matchar alla tecken som inte ingår i ord - allt utom bokstäver, siffror eller understreck. Samma som [^a-zA-Z0-9_] eller [^\w].

POSIX klassnotation, [:<class namn>:] stöds också. Exempelvis är [:digit:] ekvivalent med \d, och [:space:] med \s. Se den fullständiga listan över POSIX teckenklasser här.

De förkortade klasserna kan användas inne i en annan klass. För att till exempel matcha ett ord-tecken, ett mellanslag eller en punkt, skulle du kunna skriva [\w \.].

Tecken med särskild betydelse inne i teckenklasser

Följande tecken har en särskild betydelse inne i konstruktionen [] för teckenklasser, och måste undantas för att användas uttryckligen i en teckenklass:

]

Avslutar teckenklassen. Måste undantas om det inte är det allra första tecknet i klassen (kan följa en hatt som inte undantas).

^ (hatt)

Anger en negativ klass, om det är det första tecknet. Måste undantas för att uttryckligen matcha om det är det första tecknet i klassen.

- (minus)

Anger ett logiskt intervall. Måste alltid undantas inne i en teckenklass.

\ (bakstreck)

Undantagstecknet. Måste alltid undantas.

Alternativ: matchar en av

Om du vill matcha en av ett antal olika mönster, kan du skilja dem åt med | (ett vertikalt streck).

För att till exempel antingen hitta John eller Harry kan du använda uttrycket John|Harry.

Delmönster

Delmönster är mönster som innesluts i parenteser, och som har flera användningar i de reguljära uttryckens värld.

Ange alternativ

Du kan använda ett delmönster för att gruppera ett antal alternativ i ett större mönster. Alternativen delas av tecknet | (vertikalt streck).

För att till exempel matcha antingen orden int, float eller double, skulle du kunna använda mönstret int|float|double. Om du bara vill hitta ordet om det följs av blanktecken och därefter några bokstäver, placera alternativen i ett delmönster: (int|float|double)\s+\w+.

Spara text som matchar (bakåtreferenser)

Om du vill använda en bakåtreferens, använd ett delmönster (MÖNSTER) för att komma ihåg önskad del av mönstret. För att förhindra att delmönstret lagras, använd en icke-lagrande grupp (?:PATTERN).

Om du till exempel vill hitta två förekomster av samma ord åtskilda av ett kommatecken och möjligen några blanktecken, skulle du kunna skriva (\w+),\s*\1. Delmönstret \w+ skulle hitta en grupp med ord-tecken, och hela uttrycket skulle matcha om de följdes av ett komma, noll eller flera blanktecken och sedan en likadan grupp med ord-tecken. (Strängen \1 refererar till det första delmönstret inneslutet i parenteser).

Notera

För att undvika tvetydigheter vid användning av \1 med efterföljande siffror (t.ex. kan \12 vara det tolfte delmönstret eller bara det första delmönstret med 2) använder vi \{12} som syntax för delmönster med flera siffror.

Exempel:

  • \{12}1 är använd delmönster 12

  • \123 är använd delmönster 1 därefter 23 som normal text

Påståenden för sökning framåt

Ett påstående för sökning framåt är ett delmönster, som antingen börjar med ?= eller ?!.

För att till exempel uttryckligen matcha strängen Bill men bara om den inte följs av Gates, skulle du kunna använda det här uttrycket: Bill(?! Gates). (Det här skulle hitta Bill Clinton samt Billy the kid, men tyst ignorera de andra träffarna).

Delmönster som används för påståenden sparas inte.

Se också Påståenden.

Påståenden för sökning bakåt

Ett påstående för sökning bakåt är ett delmönster, som antingen börjar med ?<= eller ?<!.

Sökning bakåt har samma effekt som sökning framåt, men fungerar baklänges. För att exempelvis matcha den exakta strängen frukt men bara om den inte föregås av grape, skulle du kunna använda det här uttrycket: (?<!grape)frukt.

Delmönster som används för påståenden sparas inte.

Se också Påståenden.

Tecken med särskild betydelse inne i mönster

Följande tecken har särskild betydelse inne i mönster, och måste undantas om du uttryckligen vill matcha dem:

\ (bakstreck)

Undantagstecknet.

^ (hatt)

Anger början på strängen.

$

Anger slutet på strängen.

() (vänster och höger parentes)

Anger delmönster.

{} (vänster och höger klammer)

Anger numerisk kvalificering.

[] (vänster och höger hakparentes)

Anger teckenklasser.

| (vertikalt streck)

Logiskt ELLER. Skiljer alternativ.

+ (plustecken)

Kvalificering, en eller flera.

* (asterisk)

Kvalificering, noll eller flera.

? (frågetecken)

Ett extra tecken. Kan tolkas som en kvalificering, noll eller ett.