Ladda ner PDF
Regulära uttryck är en grupp tecken eller symboler som används för att hitta ett visst mönster i en text; man kan kalla dem wildcards på steroider, om man så vill. Som utvecklare kan behärskning av reguljära uttryck vara ett kraftfullt verktyg att ha i sitt verktygsbälte; du kommer definitivt att behöva använda dem i dina program någon gång, sökning och ersättning med hjälp av reguljära uttryck i IDE:er är verkligen praktiskt ibland och jag finner mig själv använda dem på kommandoraden varje dag.
Olika tillämpningar och programmeringsspråk kan ha olika implementeringar för reguljära uttryck, men de underliggande koncepten är för det mesta desamma. I det här inlägget ska jag förklara allt du behöver veta om reguljära uttryck.
Ett reguljärt uttryck är ett mönster som matchas mot en ämnessträng från vänster till höger. Ordet ”reguljärt uttryck” är en munsbit, du hittar oftast termen förkortad som ”regex” eller ”regexp”. Reguljära uttryck används för att ersätta en text i en sträng, validera formulär, extrahera en delsträng från en sträng baserat på en mönstermatchning och så mycket mer.
Föreställ dig att du skriver ett program och att du vill ställa in reglerna för när en användare väljer sitt användarnamn. Vi vill tillåta att användarnamnet innehåller bokstäver, siffror, understrykningar och bindestreck. Vi vill också begränsa antalet tecken i användarnamnet så att det inte ser fult ut. Vi använder följande reguljära uttryck för att validera ett användarnamn:
Ovanstående reguljära uttryck kan acceptera strängarna john_doe
, jo-hn_doe
och john12_as
. Det matchar inte Jo
eftersom den strängen innehåller stora bokstäver och dessutom är för kort.
- Innehållsförteckning
- Basic Matchers
- Metakaraktärerna
- 2.1 Fullständigt stopp
- 2.2 Teckenuppsättning
- 2.2.1 Negerad teckenuppsättning
- 2.3 Upprepningar
- 2.3.1 Stjärnan
- 2.3.2 Plustecknet
- 2.3.3 Frågetecknet
- 2.4 Hängslen
- 2.5 Teckengrupp
- 2.6 Alternation
- 2.7 Undvikande av specialtecken
- 2.8 Ankare
- 2.8.1 Caret
- 2.8.2 Dollar
- Shorthand Character Sets
- Lookaround
- 4.1 Positiv lookahead
- 4.2 Negativ lookahead
- 4.3 Positiv Lookbehind
- 4.4 Negativ lookbehind
- Flaggor
- 5.1 Case Insensitive
- 5.2 Global sökning
- 5.3 Flerradig
- Greedy vs lata matchning
Innehållsförteckning
- Grundläggande matchare
- Metatecken
- Full stop
- Teckensättning
- Teckensättning med negerade tecken
- Repetitioner
- Den Stjärnan
- Pluset
- Frågetecknet
- Krassen
- Teckengrupp
- Alternation
- Specialtecken för utflykt
- Anchors
- Kärta
- Dollar
- Skorthandteckenuppsättningar
- Lookaround
- Positive Lookahead
- Negative Lookahead
- Positive Lookbehind
- Flags
- Case Insensitive
- Global search
- Multiline
- Greedy vs lazy matching
Basic Matchers
Ett reguljärt uttryck är bara ett mönster av tecken som vi använder för att utföra
sökning i en text. Det reguljära uttrycket the
betyder till exempel: bokstavent
, följt av bokstaven h
, följt av bokstaven e
.
the => The fat cat sat on the mat.
Testa det reguljära uttrycket
Det reguljära uttrycket 123
matchar strängen 123
. Det reguljära uttrycket matchas mot en inmatningssträng genom att varje tecken i det reguljära
uttrycket jämförs med varje tecken i inmatningssträngen, ett efter ett. Reguljära
uttryck är normalt sett skiftlägeskänsliga, så det reguljära uttrycket The
skulle
inte matcha strängen the
.
The => The fat cat sat on the mat.
Testar det reguljära uttrycket
Metakaraktärerna
Metakaraktärerna är byggstenarna i de reguljära uttrycken. Meta
tecken står inte för sig själva utan tolkas istället på något
särskilt sätt. Vissa metatecken har en speciell betydelse och skrivs inom hakparenteser. Metatecknen är följande:
2.1 Fullständigt stopp
Fullständigt stopp . är det enklaste exemplet på metatecken. Metatecknet .
matchar vilket enskilt tecken som helst. Det matchar inte retur- eller newline-tecken.
Till exempel betyder det reguljära uttrycket .ar
: vilket tecken som helst, följt av bokstaven a
, följt av bokstaven r
.
.ar => The car parked in the garage.
Testar det reguljära uttrycket
2.2 Teckenuppsättning
Teckenuppsättningar kallas också för teckenklass. Kvadratiska parenteser används för att
specificera teckenuppsättningar. Använd ett bindestreck inuti en teckenuppsättning för att ange teckenens intervall. Ordningen på teckenområdet inom hakparenteser
spelar ingen roll. Det reguljära uttrycket he
betyder till exempel: ett stort T
eller litet t
, följt av bokstaven h
, följt av bokstaven e
.
he => The car parked in the garage.
Testar det reguljära uttrycket
En punkt inom en teckenuppsättning betyder dock en bokstavlig punkt. Det reguljära
uttrycket ar
betyder: ett gemener a
, följt av bokstaven r
,
följt av en punkt .
tecken.
ar => A garage is a good place to park a car.
Testar det reguljära uttrycket
2.2.1 Negerad teckenuppsättning
I allmänhet representerar caret-symbolen strängens början, men när den är
typerad efter den inledande hakparentesen negerar den teckenuppsättningen. För
exempel betyder det reguljära uttrycket ar
: alla tecken utom c
,
följt av tecknet a
, följt av bokstaven r
.
ar => The car parked in the garage.
Testar det reguljära uttrycket
2.3 Upprepningar
Följande metatecken +
, *
eller ?
används för att ange hur många gånger ett undermönster kan förekomma. Dessa metatecken fungerar olika i olika
situationer.
2.3.1 Stjärnan
Symbolen *
matchar noll eller fler upprepningar av den föregående matcharen. Det reguljära uttrycket a*
betyder: noll eller fler upprepningar av föregående tecken med små bokstäver a
. Men om det förekommer efter en teckenuppsättning eller klass hittar det upprepningar av hela teckenuppsättningen. Det reguljära uttrycket *
betyder till exempel: ett obegränsat antal små bokstäver i en rad.
* => The car parked in the garage #21.
Testar det reguljära uttrycket
Symbolen *
kan användas tillsammans med metatecknet . för att matcha vilken sträng som helst av
tecken .*
. Symbolen *
kan användas tillsammans med whitespace-tecknet \s
för att matcha en sträng av whitespace-tecken. Uttrycket\s*cat\s*
betyder till exempel: noll eller fler blanksteg, följt av småbokstavstecknet c
,
följt av småbokstavstecknet a
, följt av småbokstavstecknet t
, följt av noll eller fler blanksteg.
\s*cat\s* => The fat cat sat on the concatenation.
Testar det reguljära uttrycket
2.3.2 Plustecknet
Symbolen +
matchar en eller flera upprepningar av det föregående tecknet. Det reguljära uttrycket c.+t
betyder till exempel: Liten bokstav c
, följt av minst ett tecken, följt av det lilla tecknet t
. Det måste förtydligas att t
är det sista t
i meningen.
c.+t => The fat cat sat on the mat.
Testa det reguljära uttrycket
2.3.3 Frågetecknet
I det reguljära uttrycket gör metatecknet ?
att det föregående tecknet
är valfritt. Denna symbol matchar noll eller en instans av det föregående tecknet. Det reguljära uttrycket ?he
innebär till exempel följande: Valfritt den stora bokstaven T
, följt av det lilla tecknet h
, följt av det lilla tecknet e
.
he => The car is parked in the garage.
Testar det reguljära uttrycket
?he => The car is parked in the garage.
Testar det reguljära uttrycket
2.4 Hängslen
I reguljära uttryck används hängslen som också kallas kvantifierare för att
angivande hur många gånger ett tecken eller en grupp av tecken kan
upprepas. Det reguljära uttrycket {2,3}
betyder till exempel: Det betyder: Matcha minst 2 siffror men högst 3 ( tecken i intervallet 0-9).
{2,3} => The number was 9.9997 but we rounded it off to 10.0.
Testar det reguljära uttrycket
Vi kan utelämna det andra numret. Det reguljära uttrycket{2,}
betyder till exempel: Matcha 2 eller fler siffror. Om vi också tar bort kommatecknet betyder det
reguljära uttrycket {3}
:
{2,} => The number was 9.9997 but we rounded it off to 10.0.
Testar det reguljära uttrycket
{3} => The number was 9.9997 but we rounded it off to 10.0.
Testar det reguljära uttrycket
2.5 Teckengrupp
Teckengrupp är en grupp av undermönster som skrivs inom parentes (…)
. Som vi diskuterade tidigare att i reguljära uttryck om vi sätter en kvantifierare efter ett tecken så kommer det att upprepa det föregående tecknet. Men om vi sätter en kvantifierare efter en teckengrupp upprepar den hela teckengruppen. Det reguljära uttrycket (ab)*
matchar till exempel noll eller fler upprepningar av tecknet ab
. Vi kan också använda alterneringen |
meta tecken inom teckengrupp. Det reguljära uttrycket (c|g|p)ar
innebär till exempel: små bokstäver tecken c
, g
eller p
, följt av tecken a
, följt av tecken r
.
(c|g|p)ar => The car is parked in the garage.
Testar det reguljära uttrycket
2.6 Alternation
I reguljära uttryck Vertikalstrecket |
används för att definiera alternation. Alternation är som ett villkor mellan flera uttryck. Nu kanske du tänker att teckenuppsättning och alternation fungerar på samma sätt. Men den stora skillnaden mellan teckenuppsättning och alternation är att teckenuppsättning fungerar på teckennivå, medan alternation fungerar på uttrycksnivå. Det reguljära uttrycket (T|t)he|car
betyder till exempel: stor bokstav T
eller liten bokstav t
, följt av liten bokstav h
, följt av liten bokstav e
eller liten bokstav c
, följt av liten bokstav a
, följt av liten bokstav r
.
(T|t)he|car => The car is parked in the garage.
Testa det reguljära uttrycket
2.7 Undvikande av specialtecken
Backslash \
används i reguljära uttryck för att undkomma nästa tecken. Detta
ger oss möjlighet att ange en symbol som ett matchande tecken inklusive reserverade
tecken { } / \ + * . $ ^ | ?
. Om du vill använda ett specialtecken som matchande tecken sätter du \ framför det.
Till exempel används det reguljära uttrycket . för att matcha alla tecken utom
newline. För att matcha . i en inmatningssträng innebär det reguljära uttrycket (f|c|m)at\.?
följande: Lågbokstav f
, c
eller m
följt av lågbokstav
tecken a
, följt av lågbokstav t
, följt av valfritt .
tecken.
(f|c|m)at\.? => The fat cat sat on the mat.
Testa det reguljära uttrycket
2.8 Ankare
I reguljära uttryck använder vi ankare för att kontrollera om den matchande symbolen är
startsymbolen eller slutsymbolen i inmatningssträngen. Det finns två typer av ankare: Den första typen är Caret ^
som kontrollerar om det matchande tecknet är starttecken
i inmatningssträngen och den andra typen är Dollar $
som kontrollerar om det matchande
tecknet är det sista tecknet i inmatningssträngen.
2.8.1 Caret
Caret ^
-symbolen används för att kontrollera om det matchande tecknet är det första tecknet
i inmatningssträngen. Om vi tillämpar följande reguljära uttryck ^a
(om a är
den inledande symbolen) på inmatningssträngen abc
matchar det a
. Men om vi tillämpar det reguljära uttrycket ^b
på ovanstående inmatningssträng matchar det ingenting. För i inmatningssträngen abc
är b
inte startsymbolen. Låt oss ta en titt på ett annat reguljärt uttryck ^(T|t)he
som innebär: versaltecken T
eller gemener t
är ingångsträngens startsymbol, följt av
gemener h
, följt av gemener e
.
(T|t)he => The car is parked in the garage.
Testar det reguljära uttrycket
^(T|t)he => The car is parked in the garage.
Testar det reguljära uttrycket
2.8.2 Dollar
Dollar $
-symbolen används för att kontrollera om det matchande tecknet är det sista tecknet
i den ingående strängen. Det reguljära uttrycket (at\.)$
innebär till exempel: ett tecken med små bokstäver a
, följt av ett tecken med små bokstäver t
, följt av ett .
-tecken, och matchningen måste vara i slutet av strängen.
(at\.) => The fat cat. sat. on the mat.
Testar det reguljära uttrycket
(at\.)$ => The fat cat. sat. on the mat.
Testar det reguljära uttrycket
Shorthand Character Sets
Reguljära uttryck tillhandahåller förkortningar för de vanligaste teckenuppsättningarna, som erbjuder praktiska förkortningar för vanliga reguljära uttryck. De kortfattade teckenuppsättningarna är följande:
Lookaround
Lookbehind och lookahead (även kallade lookaround) är specifika typer av
non-capturing-grupper (Används för att matcha mönstret men ingår inte i matchningslistan). Lookaheads används när vi har villkoret att detta mönster föregås eller följs av ett annat visst mönster. Vi vill till exempel hämta alla nummer som föregås av tecknet $
från följande inmatningssträng .44 and .88
. Vi kommer att använda följande reguljära uttryck (?<=$)*
som innebär: få fram alla nummer som innehåller tecknet . och som föregås av tecknet $
. Följande är de lookarounds som används i reguljära uttryck:
4.1 Positiv lookahead
Positiv lookahead hävdar att den första delen av uttrycket måste vara
följd av lookaheaduttrycket. Den returnerade matchningen innehåller endast den text som matchas av den första delen av uttrycket. För att definiera en positiv
lookahead används parenteser. Inom dessa parenteser används ett frågetecken med likhetstecken på följande sätt: (?=…)
. Lookahead-uttrycket skrivs efter likhetstecknet inom parentesen. Exempelvis betyder det reguljära uttrycket(T|t)he(?=\sfat)
: matcha valfritt den lilla bokstaven t
eller den stora bokstaven T
, följt av bokstaven h
, följt av bokstaven e
. Inom parentes definierar vi positiv lookahead som talar om för reguljära uttrycksmotorn att matcha The
eller the
som följs av ordet fat
.
(T|t)he(?=\sfat) => The fat cat sat on the mat.
Testar det reguljära uttrycket
4.2 Negativ lookahead
Negativ lookahead används när vi behöver få fram alla träffar från inmatningssträngen
som inte följs av ett mönster. Negativ lookahead definieras på samma sätt som positiv lookahead, men den enda skillnaden är att vi använder negation !
i stället för lika =
tecken, dvs. (?!…)
. Låt oss ta en titt på följande reguljära uttryck (T|t)he(?!\sfat)
som innebär: hämta alla The
eller the
ord från inmatningssträngen som inte följs av ordet fat
som föregås av ett mellanslagstecken.
(T|t)he(?!\sfat) => The fat cat sat on the mat.
Testar det reguljära uttrycket
4.3 Positiv Lookbehind
Positiv lookbehind används för att hämta alla träffar som föregås av ett
specifikt mönster. Positiv lookbehind betecknas med (?<=…)
. Det reguljära uttrycket (?<=(T|t)he\s)(fat|mat)
betyder till exempel: hämta alla fat
eller mat
ord från inmatningssträngen som är efter ordet The
eller the
.
(?<=(T|t)he\s)(fat|mat) => The fat cat sat on the mat.
Testar det reguljära uttrycket
4.4 Negativ lookbehind
Negativ lookbehind används för att hämta alla träffar som inte föregås av ett
specifikt mönster. Negativ lookbehind betecknas med (?<!…)
. Det reguljära uttrycket (?<!(T|t)he\s)(cat)
betyder t.ex: hämtar alla cat
ord från inmatningssträngen som inte är efter ordet The
eller the
.
(?<!(T|t)he\s)(cat) => The cat sat on cat.
Testar det reguljära uttrycket
Flaggor
Flaggor kallas också för modifierare eftersom de ändrar utgången av ett reguljärt
uttryck. Dessa flaggor kan användas i valfri ordning eller kombination och är en
integral del av RegExp.
5.1 Case Insensitive
Modifieraren i
används för att utföra matchning som är skiftlägesoberoende. Det reguljära uttrycket /The/gi
betyder till exempel: stor bokstav T
, följt av små bokstäver h
, följt av tecken e
. Och i slutet av det reguljära uttrycket anger flaggan i
att den reguljära uttrycksmotorn ska ignorera storleken på storleken. Som du kan se har vi också angett flaggan g
eftersom vi vill söka efter mönstret i hela inmatningssträngen.
The => The fat cat sat on the mat.
Testa det reguljära uttrycket
/The/gi => The fat cat sat on the mat.
Testa det reguljära uttrycket
5.2 Global sökning
Modifieringsfaktorn g
används för att utföra en global matchning (hitta alla träffar i stället för att stanna efter den första träffen). Exempelvis betyder det reguljära uttrycket /.(at)/g
: alla tecken utom ny rad, följt av små bokstäver a
, följt av små bokstäver t
. Eftersom vi har angett flaggan g
i slutet av det reguljära uttrycket kommer det nu att hitta alla träffar i inmatningssträngen, inte bara den första (vilket är standardbeteendet).
/.(at)/ => The fat cat sat on the mat.
Testar det reguljära uttrycket
/.(at)/g => The fat cat sat on the mat.
Testar det reguljära uttrycket
5.3 Flerradig
Modifieringsfaktorn m
används för att utföra en matchning på flera rader. Som vi diskuterade tidigare
används ankare (^, $)
för att kontrollera om mönstret är början av inmatningen eller slutet av inmatningssträngen. Men om vi vill att ankare fungerar på varje rad använder vi flagganm
. Det reguljära uttrycket /at(.)?$/gm
betyder till exempel: Liten bokstav
tecken a
, följt av liten bokstav t, eventuellt allt utom
ny rad. Och på grund av m
-flaggan matchar nu reguljära uttrycksmotorn mönstret i slutet av varje rad i en sträng.
/.at(.)?$/ => The fat
cat sat
on the mat.
Testar det reguljära uttrycket
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
Testar det reguljära uttrycket
Greedy vs lata matchning
Som standard gör regex en greedy matchning , vilket innebär att den matchar så länge som
möjligt. Vi kan använda ?
för att matcha på ett lat sätt betyder så kort som möjligt
/(.*at)/ => The fat cat sat on the mat.
Testar det reguljära uttrycket
/(.*?at)/ => The fat cat sat on the mat.
Testar det reguljära uttrycket
Och med det tar det här inlägget slut. Jag hoppas att det här inlägget var till hjälp. Se till att öva på det du lärt dig genom att använda tjänster som regexr.com eller regex101.com.