Regulære udtryk har ry for at ligne tilfældig støj. Et mønster som ^[\w.-]+@[\w-]+\.\w{2,}$ kan føles som om en kat har gået hen over tastaturet. Men bag den kryptiske syntaks gemmer sig en bemærkelsesværdig elegant idé: et koncist sprog til at beskrive mønstre i tekst.
Uanset om du validerer formularinput, søger i logfiler, renser data eller laver find-og-erstat på tværs af en kodebase, er regex et af de mest alsidige værktøjer i en udviklers værktøjskasse. Og du behøver ikke at huske enhver obskur funktion for at få reel værdi af det. En håndfuld byggeklodser dækker langt de fleste praktiske brugscases.
Hvad regex faktisk gør
Et regulært udtryk (regex eller regexp) er et mønster, der beskriver et sæt af strenge. Du giver det til en søgemaskine — i dit programmeringssprog, din teksteditor eller dit kommandolinjeværktøj — og den finder enhver streng, der matcher.
Tænk på det som en opgraderet søgeforespørgsel:
- Normal søgning: find det nøjagtige ord "error"
- Regex-søgning: find alt der ligner en IP-adresse, en dato, en e-mailadresse eller enhver struktur, du kan beskrive
Regex blev opfundet af matematikeren Stephen Kleene i 1956 og kom ind i computing gennem Unix-teksteditorer i 1960'erne. I dag understøttes det i stort set alle programmeringssprog og teksteditorer.
Byggeklodserne
Bogstavelige tegn
Den simpleste regex er ren tekst. Mønstret hello matcher strengen "hello", uanset hvor den optræder. Intet fancy.
Punktummet (.) — et vilkårligt tegn
Et punktum matcher et vilkårligt enkelt tegn undtagen linjeskift.
h.tmatcher "hat", "hit", "hot", "h3t" og endda "h t"
Tegnklasser ([])
Firkantede parenteser definerer et sæt tilladte tegn på én position.
[aeiou]— enhver vokal[0-9]— ethvert ciffer[A-Za-z]— ethvert bogstav[^0-9]— ethvert tegn, der IKKE er et ciffer (^inde i parenteser betyder "ikke")
Forkortede klasser
| Forkortelse | Betydning | Svarer til |
|---|---|---|
\d |
Ethvert ciffer | [0-9] |
\w |
Ordtegn | [A-Za-z0-9_] |
\s |
Mellemrum | [ \t\n\r] |
\D |
Ikke et ciffer | [^0-9] |
\W |
Ikke et ordtegn | [^A-Za-z0-9_] |
\S |
Ikke mellemrum | [^ \t\n\r] |
Kvantifikatorer — hvor mange
Kvantifikatorer styrer, hvor mange gange det foregående element skal optræde.
| Symbol | Betydning | Eksempel | Matcher |
|---|---|---|---|
* |
Nul eller flere | ab*c |
"ac", "abc", "abbc" |
+ |
En eller flere | ab+c |
"abc", "abbc" (ikke "ac") |
? |
Nul eller en | colou?r |
"color" og "colour" |
{3} |
Nøjagtigt 3 | \d{3} |
"123", "456" |
{2,4} |
Mellem 2 og 4 | \d{2,4} |
"12", "123", "1234" |
Ankre — position
^— begyndelsen af strengen (eller linjen, medm-flaget)$— slutningen af strengen (eller linjen)\b— ordgrænse
Mønstret ^\d{4}$ matcher en streng, der er nøjagtigt fire cifre, som "2026", men ikke "abc2026" eller "2026xyz".
Grupper og alternation
(abc)— fanger "abc" som en gruppea|b— matcher "a" eller "b"(cat|dog)— matcher "cat" eller "dog"
Grupper lader dig også anvende kvantifikatorer på sekvenser: (ha)+ matcher "ha", "haha", "hahaha".
Almindelige praktiske mønstre
Validér en e-mail (simpel)
^[\w.-]+@[\w-]+\.\w{2,}$
Dette matcher user@example.com, first.last@company.co.uk (delvist) og afviser strenge uden @ eller domæne.
Vigtigt: At validere e-mailadresser perfekt med regex er notorisk svært — den fulde RFC 5322-specifikation er ekstremt kompleks. Til produktionssystemer bør du bruge en simpel regex til formatchecking og derefter verificere adressen ved at sende en bekræftelsesmail.
Match et telefonnummer
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Dette håndterer formater som +1 555 123 4567, 555-123-4567 og (555) 123-4567.
Match en URL
https?://[\w.-]+(/[\w./?&=-]*)?
Matcher https://example.com, http://example.com/path?q=hello.
Match en dato (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Matcher 2026-03-29, 1999-12-31. Bemærk: dette tjekker kun format, ikke gyldighed — det ville også matche 9999-99-99.
Flag der ændrer adfærd
De fleste regex-motorer understøtter flag, der ændrer, hvordan mønstret anvendes:
| Flag | Navn | Effekt |
|---|---|---|
g |
Global | Find alle matches, ikke kun den første |
i |
Versalfølsom | hello matcher "Hello", "HELLO" osv. |
m |
Flerlinje | ^ og $ matcher start/slut af hver linje |
s |
Dotall | . matcher også linjeskifttegn |
I JavaScript tilføjes flag efter den afsluttende skråstreg: /hello/gi. I Python sendes de som argumenter: re.findall(r"hello", text, re.IGNORECASE).
Hvornår regex er overkill
Regex er kraftfuldt, men det er ikke altid det rigtige værktøj:
- Parsing af HTML eller XML. Brug en rigtig DOM-parser. Regex kan ikke pålideligt håndtere indlejrede tags.
- Parsing af JSON. Brug
JSON.parse()eller tilsvarende. Regex vil fejle på kanttilfælde. - Kompleks validering. Hvis dit mønster strækker sig over flere linjer og tager fem minutter at læse, bør du overveje at skrive procedurel valideringskode i stedet.
- Simple strengoperationer. Hvis du bare har brug for
startsWith(),includes()ellersplit(), er almindelige strengmetoder klarere og hurtigere.
Almindelige faldgruber
- Glemmer at escape specialtegn. Punktummet
.matcher ethvert tegn. For at matche et bogstaveligt punktum, brug\.. Det samme gælder for(,),[,],+,*,?,{,},^,$,|og\. - Grådig vs. doven matching. Som standard er
.*grådig — den matcher så meget som muligt. Tilføj?for at gøre den doven:.*?matcher så lidt som muligt. Dette er vigtigt, når du udtrækker indhold mellem begrænsere. - Katastrofal backtracking. Indlejrede kvantifikatorer som
(a+)+kan få motoren til at prøve et eksponentielt antal stier på visse input, hvilket fryser dit program. Undgå indlejret gentagelse på overlappende mønstre. - Glemmer ankre. Uden
^og$matcher dit mønster delstrenge.\d{3}matcher "123" inde i "abc12345". Brug^\d{3}$, hvis du har brug for et nøjagtigt match.
Gå videre
Den bedste måde at lære regex på er at eksperimentere. Skriv et mønster, indsæt noget testtekst og se, hvad der lyser op. Juster og iterér, indtil du forstår, hvordan hver del fungerer.
- Sådan tester du Regex-mønstre — interaktiv vejledning med eksempler
- Regex-tester — indsæt dit mønster og testdata, se matches fremhævet i realtid
