Download PDF
Regulære udtryk er en gruppe tegn eller symboler, der bruges til at finde et bestemt mønster i en tekst; man kan kalde dem wildcards på steroider, hvis man vil. Som udvikler kan det at beherske regulære udtryk være et kraftfuldt værktøj at have i sin værktøjsbælte; du vil helt sikkert blive nødt til at bruge dem i dine programmer på et tidspunkt, søgning og erstatning ved hjælp af regulære udtryk i IDE’er er virkelig praktisk nogle gange, og jeg finder mig selv ved at bruge dem i kommandolinjen hver eneste dag.
Differente programmer og programmeringssprog kan have forskellige implementeringer for regulære udtryk, men de underliggende koncepter er for det meste de samme. I dette indlæg vil jeg forklare alt, hvad du har brug for at vide om regulære udtryk.
Et regulært udtryk er et mønster, der matches mod en emnestreng fra venstre til højre. Ordet “Regular expression” er en mundfuld, du vil normalt finde udtrykket forkortet som “regex” eller “regexp”. Regular expression bruges til at erstatte en tekst i en streng, validere formular, udtrække en delstreng fra en streng baseret på et mønstermatch og så meget mere.
Forestil dig, at du skriver et program, og at du ønsker at fastsætte reglerne for, hvornår en bruger vælger sit brugernavn. Vi ønsker at tillade, at brugernavnet kan indeholde bogstaver, tal, understregninger og bindestreger. Vi ønsker også at begrænse antallet af tegn i brugernavnet, så det ikke ser grimt ud. Vi bruger følgende regulære udtryk til at validere et brugernavn:
Ovenstående regulære udtryk kan acceptere strengene john_doe
, jo-hn_doe
og john12_as
. Det passer ikke til Jo
, fordi denne streng indeholder store bogstaver, og fordi den også er for kort.
- Indholdsfortegnelse
- Basic Matchers
- Metakendetegn
- 2.1 Fuldt punktum
- 2.2 Tegnsæt
- 2.2.1 Negeret tegnsæt
- 2.3 Gentagelser
- 2.3.1 Stjernen
- 2.3.3.2 Plus
- 2.3.3.3 Spørgsmålstegn
- 2.4 Parenteser
- 2.5 Karaktergruppe
- 2.6 Alternation
- 2.7 Undgåelse af specialtegn
- 2.8 Ankre
- 2.8.1 Caret
- 2.8.2 Dollar
- Shorthand-tegnsæt
- Lookaround
- 4.1 Positiv lookahead
- 4.2 Negativ lookahead
- 4.3 Positiv lookbehind
- 4.4 Negativ lookbehind
- Flag
- 5.1 Case Insensitive
- 5.2 Global søgning
- 5.3 Multiline
- Greedy vs lazy matching
Indholdsfortegnelse
- Grundlæggende matchere
- Meta-tegn
- Fuldt punktum
- Tegnsæt af tegn
- Negeret tegnsæt
- Repetitioner
- Den Stjerne
- Pluset
- Spørgsmålstegnet
- Rækker
- Tegnsgruppe
- Alternation
- Speciale tegn til undvigelse
- Anchors
- Karet
- Dollar
- Kortsæt af forkortede tegn
- Lookaround
- Positive Lookahead
- Negative Lookahead
- Positive Lookbehind
- Flags
- Case Insensitive
- Global search
- Multiline
- Greedy vs lazy matching
Basic Matchers
Et regulært udtryk er blot et mønster af tegn, som vi bruger til at udføre
søgning i en tekst. Det regulære udtryk the
betyder f.eks.: bogstavett
, efterfulgt af bogstavet h
, efterfulgt af bogstavet e
.
the => The fat cat sat on the mat.
Test det regulære udtryk
Det regulære udtryk 123
matcher strengen 123
. Det regulære udtryk matches mod en indtastningsstreng ved at sammenligne hvert tegn i det regulære
udtryk med hvert tegn i indtastningsstrengen, det ene efter det andet. Regulære
udtryk er normalt case-sensitive, så det regulære udtryk The
ville
ikke
matche strengen the
.
The => The fat cat sat on the mat.
Test det regulære udtryk
Metakendetegn
Metakendetegn er byggestenene i de regulære udtryk. Meta
tegnene står ikke for sig selv, men fortolkes i stedet på en
særlig måde. Nogle meta-tegn har en særlig betydning og er skrevet inden for firkantede parenteser. Meta-tegnene er som følger:
2.1 Fuldt punktum
Fuldt punktum . er det enkleste eksempel på et meta-tegn. Meta-tegnet .
passer til ethvert enkelt tegn. Det matcher ikke retur- eller newline-tegn.
For eksempel betyder det regulære udtryk .ar
: ethvert tegn, efterfulgt af bogstavet a
, efterfulgt af bogstavet r
.
.ar => The car parked in the garage.
Test det regulære udtryk
2.2 Tegnsæt
Tegnsæt kaldes også for karakterklasse. Der bruges firkantede parenteser til at
angive tegnsæt. Brug en bindestreg inden for et tegnsæt for at angive tegnenes rækkevidde. Rækkefølgen af tegnområdet inden for firkantede parenteser
er ligegyldig. Det regulære udtryk he
betyder f.eks.: et stort bogstav T
eller et lille bogstav t
, efterfulgt af bogstavet h
, efterfulgt af bogstavet e
.
he => The car parked in the garage.
Test det regulære udtryk
Et punktum inden for et tegnsæt betyder dog et bogstaveligt punktum. Det regulære
udtryk ar
betyder: et lille bogstav a
, efterfulgt af bogstavet r
,
efterfulgt af et punktum .
.
ar => A garage is a good place to park a car.
Test af det regulære udtryk
2.2.1 Negeret tegnsæt
Generelt repræsenterer caret-symbolet starten af strengen, men når det er
indtastet efter den indledende firkantede parentes, negerer det tegnsættet. For
eksempel betyder det regulære udtryk ar
: ethvert tegn undtagen c
,
efterfulgt af tegnet a
, efterfulgt af bogstavet r
.
ar => The car parked in the garage.
Test det regulære udtryk
2.3 Gentagelser
Følgende metakendetegn +
, *
eller ?
bruges til at angive, hvor mange gange et undermønster kan forekomme. Disse meta-tegn virker forskelligt i forskellige
situationer.
2.3.1 Stjernen
Symbolet *
matcher nul eller flere gentagelser af den forrige matcher. Det regulære udtryk a*
betyder: nul eller flere gentagelser af det foregående tegn med små bogstaver a
. Men hvis det optræder efter et tegnsæt eller en klasse, finder det gentagelser af hele tegnsættet. F.eks. betyder det regulære udtryk *
: et vilkårligt antal små bogstaver i en række.
* => The car parked in the garage #21.
Test det regulære udtryk
Symbolet *
kan bruges sammen med meta-tegnet . til at matche en vilkårlig streng af
tegn .*
. Symbolet *
kan bruges sammen med whitespace-tegnet \s
til at matche en streng af whitespace-tegn. F.eks. betyder udtrykket\s*cat\s*
: nul eller flere mellemrum, efterfulgt af lille bogstavtegn c
,
efterfulgt af lille bogstavtegn a
, efterfulgt af lille bogstavtegn t
, efterfulgt af nul eller flere mellemrum.
\s*cat\s* => The fat cat sat on the concatenation.
Test det regulære udtryk
2.3.3.2 Plus
Symbolet +
matcher en eller flere gentagelser af det foregående tegn. F.eks. betyder det regulære udtryk c.+t
: lille bogstav c
, efterfulgt af mindst ét tegn, efterfulgt af lille bogstav t
. Det skal præciseres, at t
er det sidste t
i sætningen.
c.+t => The fat cat sat on the mat.
Test det regulære udtryk
2.3.3.3 Spørgsmålstegn
I det regulære udtryk gør meta-tegnet ?
det foregående tegn
optionelt. Dette symbol passer til nul eller én forekomst af det foregående tegn. Det regulære udtryk ?he
betyder f.eks: Valgfrit det store bogstav T
, efterfulgt af det lille bogstav h
, efterfulgt af det lille bogstav e
.
he => The car is parked in the garage.
Test det regulære udtryk
?he => The car is parked in the garage.
Test det regulære udtryk
2.4 Parenteser
I regulære udtryk bruges parenteser, der også kaldes kvantifikatorer, til at
angive det antal gange, et tegn eller en gruppe af tegn kan
gennemføres. For eksempel betyder det regulære udtryk {2,3}
: Det betyder: Match mindst 2 cifre, men ikke mere end 3 ( tegn i intervallet 0 til 9).
{2,3} => The number was 9.9997 but we rounded it off to 10.0.
Test det regulære udtryk
Vi kan udelade det andet tal. For eksempel betyder det regulære udtryk{2,}
: Match 2 eller flere cifre. Hvis vi også fjerner kommaet betyder det
regulære udtryk{3}
: Match præcis 3 cifre.
{2,} => The number was 9.9997 but we rounded it off to 10.0.
Test det regulære udtryk
{3} => The number was 9.9997 but we rounded it off to 10.0.
Test det regulære udtryk
2.5 Karaktergruppe
Karaktergruppe er en gruppe af undermønstre, der er skrevet inden for parenteser (…)
. Som vi diskuterede før, at i regulære udtryk, hvis vi sætter en kvantifikator efter et tegn, så vil det gentage det foregående tegn. Men hvis vi sætter en kvantifikator efter en tegngruppe, gentager den hele tegngruppen. F.eks. passer det regulære udtryk (ab)*
til nul eller flere gentagelser af tegnet ab
. Vi kan også bruge vekselordet |
meta-tegn inden for en tegngruppe. F.eks. betyder det regulære udtryk (c|g|p)ar
: lille bogstavtegn c
, g
eller p
, efterfulgt af tegn a
, efterfulgt af tegn r
.
(c|g|p)ar => The car is parked in the garage.
Test det regulære udtryk
2.6 Alternation
I regulære udtryk bruges lodret streg |
til at definere alternation. Alternation er som en betingelse mellem flere udtryk. Nu tænker du måske, at tegnsæt og alternation fungerer på samme måde. Men den store forskel mellem tegnsæt og vekselvirkning er, at tegnsæt fungerer på tegnniveau, mens vekselvirkning fungerer på udtryksniveau. F.eks. betyder det regulære udtryk (T|t)he|car
: stort bogstav T
eller lille bogstav t
, efterfulgt af lille bogstav h
, efterfulgt af lille bogstav e
eller lille bogstav c
, efterfulgt af lille bogstav a
, efterfulgt af lille bogstav r
.
(T|t)he|car => The car is parked in the garage.
Test det regulære udtryk
2.7 Undgåelse af specialtegn
Backslash \
bruges i regulære udtryk til at undslippe det næste tegn. Dette
giver os mulighed for at angive et symbol som et matchende tegn, herunder reserverede
tegn { } / \ + * . $ ^ | ?
. Hvis du vil bruge et specialtegn som et matchende tegn, skal du sætte \ foran det.
For eksempel bruges det regulære udtryk . til at matche ethvert tegn undtagen
newline. For at matche . i en indtastningsstreng betyder det regulære udtryk (f|c|m)at\.?
nu: lille bogstav f
, c
eller m
efterfulgt af lille bogstav
tegn a
, efterfulgt af lille bogstav t
, efterfulgt af valgfrit .
-tegn.
(f|c|m)at\.? => The fat cat sat on the mat.
Test det regulære udtryk
2.8 Ankre
I regulære udtryk bruger vi ankre til at kontrollere, om det matchende symbol er
startsymbolet eller slutsymbolet i den indtastede streng. Ankre er af to typer: Den første type er Caret ^
, der kontrollerer, om det matchende tegn er starttegnet
i inputstrengen, og den anden type er Dollar $
, der kontrollerer, om det matchende
tegn er det sidste tegn i inputstrengen.
2.8.1 Caret
Caret ^
-symbolet bruges til at kontrollere, om det matchende tegn er det første tegn
i inputstrengen. Hvis vi anvender følgende regulære udtryk ^a
(hvis a er
startsymbolet) på inputstrengen abc
, passer det med a
. Men hvis vi anvender det regulære udtryk ^b
på ovenstående indtastningsstreng, matcher den ikke noget. Fordi i inputstrengen abc
er b
ikke startsymbolet. Lad os se på et andet regulært udtryk ^(T|t)he
, som betyder: Stor bogstav T
eller lille bogstav t
er startsymbolet i indtastningsstrengen, efterfulgt af
minde bogstav h
, efterfulgt af lille bogstav e
.
(T|t)he => The car is parked in the garage.
Test det regulære udtryk
^(T|t)he => The car is parked in the garage.
Test det regulære udtryk
2.8.2 Dollar
Dollar $
-symbolet bruges til at kontrollere, om det matchende tegn er det sidste tegn
i den indtastede streng. F.eks. betyder det regulære udtryk (at\.)$
: et lille bogstav a
, efterfulgt af et lille bogstav t
, efterfulgt af et .
tegn, og det matchende tegn skal være sidst i strengen.
(at\.) => The fat cat. sat. on the mat.
Test det regulære udtryk
(at\.)$ => The fat cat. sat. on the mat.
Test det regulære udtryk
Shorthand-tegnsæt
Regulære udtryk indeholder shorthands for de almindeligt anvendte tegnsæt, som tilbyder praktiske shorthands for almindeligt anvendte regulære udtryk. De korte tegnsæt er som følger:
Lookaround
Lookbehind og lookahead (også kaldet lookaround) er specifikke typer af
non-capturing-grupper (Bruges til at matche mønsteret, men er ikke medtaget i den matchende liste). Lookaheads bruges, når vi har den betingelse, at dette mønster er forud for eller efterfulgt af et andet bestemt mønster. Vi ønsker f.eks. at få alle tal, der er forudgået af $
-tegnet, fra følgende indtastningsstreng .44 and .88
. Vi vil bruge følgende regulære udtryk (?<=$)*
, som betyder: få alle de tal, der indeholder tegnet . og som er forudgået af tegnet $
. Følgende er de lookarounds, der anvendes i regulære udtryk:
4.1 Positiv lookahead
Den positive lookahead hævder, at den første del af udtrykket skal være
efterfulgt af lookahead-udtrykket. Den returnerede match indeholder kun den tekst, der er matchet af den første del af udtrykket. For at definere en positiv
lookahead anvendes parenteser. Inden for disse parenteser anvendes et spørgsmålstegn med lighedstegn på følgende måde: (?=…)
. Lookahead-udtrykket skrives efter lighedstegnet inden for parentesen. F.eks. betyder det regulære udtryk(T|t)he(?=\sfat)
: valgfrit match lille bogstav t
eller stort bogstav T
, efterfulgt af bogstav h
, efterfulgt af bogstav e
. I parentes definerer vi positiv lookahead, som fortæller regular expression engine at matche The
eller the
, som er efterfulgt af ordet fat
.
(T|t)he(?=\sfat) => The fat cat sat on the mat.
Test det regulære udtryk
4.2 Negativ lookahead
Negativ lookahead bruges, når vi har brug for at få alle matches fra inputstrengen
, som ikke er efterfulgt af et mønster. Negative lookahead defineres på samme måde som positive lookahead, men den eneste forskel er, at vi i stedet for det samme =
-tegn bruger negation !
-tegn, dvs. (?!…)
. Lad os se på følgende regulære udtryk (T|t)he(?!\sfat)
, som betyder: få alle The
eller the
ord fra inputstrengen, som ikke er efterfulgt af ordet fat
, der er forudgået af et mellemrumstegn.
(T|t)he(?!\sfat) => The fat cat sat on the mat.
Test det regulære udtryk
4.3 Positiv lookbehind
Positiv lookbehind bruges til at få alle de matches, der er forudgået af et
specifikt mønster. Positivt lookbehind betegnes med (?<=…)
. F.eks. betyder det regulære udtryk (?<=(T|t)he\s)(fat|mat)
: få alle fat
eller mat
ord fra inputstrengen, der er efter ordet The
eller the
.
(?<=(T|t)he\s)(fat|mat) => The fat cat sat on the mat.
Test det regulære udtryk
4.4 Negativ lookbehind
Negativ lookbehind bruges til at få alle de matches, der ikke er forudgået af et
specifikt mønster. Negativ lookbehind betegnes med (?<!…)
. Det regulære udtryk (?<!(T|t)he\s)(cat)
betyder f.eks: hente alle cat
ord fra inputstrengen, der ikke er efter ordet The
eller the
.
(?<!(T|t)he\s)(cat) => The cat sat on cat.
Test det regulære udtryk
Flag
Flag kaldes også for modifikatorer, fordi de ændrer output af et regulært
udtryk. Disse flag kan bruges i vilkårlig rækkefølge eller kombination og er en
integral del af RegExp.
5.1 Case Insensitive
Modifikatoren i
bruges til at udføre case-insensitive matching. F.eks. betyder det regulære udtryk /The/gi
: stort bogstav T
, efterfulgt af lille bogstav h
, efterfulgt af bogstav e
. Og i slutningen af det regulære udtryk fortæller i
-flaget den regulære udtryksmotor, at den skal ignorere kasus. Som du kan se, har vi også angivet g
-flaget, fordi vi ønsker at søge efter mønsteret i hele indtastningsstrengen.
The => The fat cat sat on the mat.
Test det regulære udtryk
/The/gi => The fat cat sat on the mat.
Test det regulære udtryk
5.2 Global søgning
Modifikatoren g
bruges til at udføre et globalt match (finde alle matches i stedet for at stoppe efter det første match). F.eks. betyder det regulære udtryk /.(at)/g
: ethvert tegn undtagen ny linje, efterfulgt af lille bogstavtegn a
, efterfulgt af lille bogstav t
. Fordi vi har angivet g
-flaget i slutningen af det regulære udtryk, vil det nu finde alle match i indtastningsstrengen og ikke kun det første (hvilket er standardadfærden).
/.(at)/ => The fat cat sat on the mat.
Test det regulære udtryk
/.(at)/g => The fat cat sat on the mat.
Test det regulære udtryk
5.3 Multiline
Modifikatoren m
bruges til at udføre et match på flere linjer. Som vi har diskuteret tidligere
ancher (^, $)
bruges til at kontrollere, om mønsteret er begyndelsen af inddatastrengen eller slutningen af inddatastrengen. Men hvis vi ønsker, at anchors virker på hver linje, bruger vim
-flaget. F.eks. betyder det regulære udtryk /at(.)?$/gm
: lille bogstav
tegn a
, efterfulgt af lille bogstav t, eventuelt alt undtagen
ny linje. Og på grund af m
-flaget passer regular expression engine nu til mønsteret i slutningen af hver linje i en streng.
/.at(.)?$/ => The fat
cat sat
on the mat.
Test det regulære udtryk
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
Test det regulære udtryk
Greedy vs lazy matching
Som standard vil regex foretage greedy matching , hvilket betyder, at den vil matche så længe
det er muligt. Vi kan bruge ?
til at matche på en doven måde betyder så kort som muligt
/(.*at)/ => The fat cat sat on the mat.
Test det regulære udtryk
/(.*?at)/ => The fat cat sat on the mat.
Test det regulære udtryk
Og med det slutter dette indlæg. Jeg håber, at dette indlæg var nyttigt. Sørg for at øve dig i det, du har lært, ved hjælp af tjenester som regexr.com eller regex101.com.