Regulære uttrykk har et rykte for å se ut som tilfeldig støy. Et mønster som ^[\w.-]+@[\w-]+\.\w{2,}$ kan føles som om en katt gikk over tastaturet. Men bak den kryptiske syntaksen skjuler seg en bemerkelsesverdig elegant idé: et konsist språk for å beskrive mønstre i tekst.
Enten du validerer skjemainndata, søker i loggfiler, renser data eller gjør finn-og-erstatt på tvers av en kodebase, er regex et av de mest allsidige verktøyene i en utviklers verktøykasse. Og du trenger ikke å memorere alle obskure funksjoner for å få reell verdi ut av det. En håndfull byggesteiner dekker det aller meste av praktiske brukstilfeller.
Hva regex faktisk gjør
Et regulært uttrykk (regex eller regexp) er et mønster som beskriver et sett av strenger. Du gir det til en søkemotor — i programmeringsspråket ditt, teksteditoren din eller kommandolinjeverktøyet ditt — og den finner hver streng som matcher.
Tenk på det som en oppgradert søkeforespørsel:
- Vanlig søk: finn det nøyaktige ordet «error»
- Regex-søk: finn alt som ser ut som en IP-adresse, en dato, en e-postadresse, eller enhver struktur du kan beskrive
Regex ble oppfunnet av matematikeren Stephen Kleene i 1956 og kom inn i databehandling gjennom Unix-teksteditorer på 1960-tallet. I dag støttes det i praktisk talt alle programmeringsspråk og teksteditorer.
Byggesteinene
Bokstavelige tegn
Den enkleste regexen er ren tekst. Mønsteret hello matcher strengen «hello» uansett hvor den opptrer. Ingenting fancy.
Punktumet (.) — ethvert tegn
Et punktum matcher ethvert enkelt tegn unntatt linjeskift.
h.tmatcher «hat», «hit», «hot», «h3t» og til og med «h t»
Tegnklasser ([])
Firkantparenteser definerer et sett av tillatte tegn på én posisjon.
[aeiou]— enhver vokal[0-9]— ethvert siffer[A-Za-z]— enhver bokstav[^0-9]— ethvert tegn som IKKE er et siffer (^inni parenteser betyr «ikke»)
Forkortede klasser
| Forkortelse | Betydning | Tilsvarer |
|---|---|---|
\d |
Ethvert siffer | [0-9] |
\w |
Ordtegn | [A-Za-z0-9_] |
\s |
Mellomrom | [ \t\n\r] |
\D |
Ikke et siffer | [^0-9] |
\W |
Ikke et ordtegn | [^A-Za-z0-9_] |
\S |
Ikke mellomrom | [^ \t\n\r] |
Kvantifiserere — hvor mange
Kvantifiserere kontrollerer hvor mange ganger det foregående elementet må opptre.
| Symbol | Betydning | Eksempel | Matcher |
|---|---|---|---|
* |
Null eller flere | ab*c |
«ac», «abc», «abbc» |
+ |
En eller flere | ab+c |
«abc», «abbc» (ikke «ac») |
? |
Null eller en | colou?r |
«color» og «colour» |
{3} |
Nøyaktig 3 | \d{3} |
«123», «456» |
{2,4} |
Mellom 2 og 4 | \d{2,4} |
«12», «123», «1234» |
Ankre — posisjon
^— begynnelsen av strengen (eller linjen, medm-flagget)$— slutten av strengen (eller linjen)\b— ordgrense
Mønsteret ^\d{4}$ matcher en streng som er nøyaktig fire sifre, som «2026», men ikke «abc2026» eller «2026xyz».
Grupper og alternering
(abc)— fanger «abc» som en gruppea|b— matcher «a» eller «b»(cat|dog)— matcher «cat» eller «dog»
Grupper lar deg også bruke kvantifiserere på sekvenser: (ha)+ matcher «ha», «haha», «hahaha».
Vanlige praktiske mønstre
Valider en e-post (enkel)
^[\w.-]+@[\w-]+\.\w{2,}$
Dette matcher user@example.com, first.last@company.co.uk (delvis), og avviser strenger uten @ eller domene.
Viktig: Å validere e-postadresser perfekt med regex er notorisk vanskelig — den fullstendige RFC 5322-spesifikasjonen er ekstremt kompleks. For produksjonssystemer bør du bruke en enkel regex for formatsjekk og deretter verifisere adressen ved å sende en bekreftelses-e-post.
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. Merk: dette sjekker bare format, ikke gyldighet — det ville også matche 9999-99-99.
Flagg som endrer oppførsel
De fleste regex-motorer støtter flagg som endrer hvordan mønsteret brukes:
| Flagg | Navn | Effekt |
|---|---|---|
g |
Global | Finn alle treff, ikke bare det første |
i |
Ufølsom for store/små bokstaver | hello matcher «Hello», «HELLO» osv. |
m |
Flerlinjet | ^ og $ matcher start/slutt av hver linje |
s |
Dotall | . matcher også linjeskifttegn |
I JavaScript legges flagg til etter den avsluttende skråstreken: /hello/gi. I Python sendes de som argumenter: re.findall(r"hello", text, re.IGNORECASE).
Når regex er overkill
Regex er kraftig, men det er ikke alltid det rette verktøyet:
- Parsing av HTML eller XML. Bruk en ordentlig DOM-parser. Regex kan ikke pålitelig håndtere nestede tagger.
- Parsing av JSON. Bruk
JSON.parse()eller tilsvarende. Regex vil feile på kanttilfeller. - Kompleks validering. Hvis mønsteret ditt strekker seg over flere linjer og tar fem minutter å lese, bør du vurdere å skrive prosedyrell valideringskode i stedet.
- Enkle strengoperasjoner. Hvis du bare trenger
startsWith(),includes()ellersplit(), er vanlige strengmetoder klarere og raskere.
Vanlige fallgruver
- Glemmer å escape spesialtegn. Punktumet
.matcher ethvert tegn. For å matche et bokstavelig punktum, bruk\.. Det samme gjelder for(,),[,],+,*,?,{,},^,$,|og\. - Grådig vs. lat matching. Som standard er
.*grådig — den matcher så mye som mulig. Legg til?for å gjøre den lat:.*?matcher så lite som mulig. Dette er viktig når du trekker ut innhold mellom skilletegn. - Katastrofal backtracking. Nestede kvantifiserere som
(a+)+kan få motoren til å prøve et eksponentielt antall stier på visse input, noe som fryser programmet ditt. Unngå nestet repetisjon på overlappende mønstre. - Glemmer ankre. Uten
^og$matcher mønsteret ditt delstrenger.\d{3}matcher «123» inne i «abc12345». Bruk^\d{3}$hvis du trenger et nøyaktig treff.
Gå videre
Den beste måten å lære regex på er å eksperimentere. Skriv et mønster, lim inn noe testtekst og se hva som lyser opp. Juster og iterer til du forstår hvordan hver del fungerer.
- Hvordan teste Regex-mønstre — interaktiv veiledning med eksempler
- Regex-tester — lim inn mønsteret og testdataene dine, se treff uthevet i sanntid
