Grunnmynstur

Helstu tákn reglulegra segða: bókstafir, sértákn, endurtekningar og einfalt kennitöludæmi.

Byrjaðu á einföldu mynstri

Venjulegir stafir passa við sjálfa sig:

Mynstur Passar við
háskóli textann háskóli
2026 textann 2026
@hi.is textann @hi.is

Krafturinn kemur þegar við bætum við táknum sem þýða meira en einn staf.

Tákn Merking Dæmi
. hvaða einn stafur sem er h.s passar við hús og has
\d tölustafur \d\d\d passar við 101
\w orðastafur bókstafur, tala eða _
\s bil, tab eða línuskil \s+ passar við eitt eða fleiri bil
[abc] einn stafur úr mengi [abc] passar við a, b eða c
[0-9] einn stafur á bili sama og \d
^ byrjun línu ^# finnur línur sem byrja á #
$ endir línu \.csv$ finnur texta sem endar á .csv
ÁbendingPunktur er ekki alltaf punktur

Í regex þýðir . „hvaða stafur sem er“. Ef þú vilt leita að alvöru punkti þarftu að skrifa \..

Mynstrið hi.is passar til dæmis líka við hiXis. Mynstrið hi\.is passar bara við hi.is.

Hversu oft má eitthvað koma?

Endurtekningartákn segja hversu oft mynstrið á undan má koma fyrir.

Tákn Merking Dæmi
? núll eða einu sinni https? passar við http og https
* núll sinnum eða oftar a* passar við ekkert, a, aa, …
+ einu sinni eða oftar \s+ passar við eitt eða fleiri bil
{3} nákvæmlega þrisvar \d{3} passar við þrjá tölustafi
{2,4} tvisvar til fjórum sinnum \d{2,4} passar við 2-4 tölustafi

Þetta gerir mynstrið bæði styttra og nákvæmara. Símanúmer á sniðinu 555-1234 má skrifa sem:

\d{3}-\d{4}

Það þýðir: þrír tölustafir, bandstrik, fjórir tölustafir.

Dæmi: kennitala

Íslensk kennitala er oft skrifuð sem sex tölustafir, bandstrik og fjórir tölustafir:

\d{6}-\d{4}

Þetta finnur texta sem lítur út eins og kennitala:

120389-4569
010101-0000
999999-9999

Síðasta dæmið er augljóslega ekki raunveruleg dagsetning. Regex getur athugað formið, en það þýðir ekki sjálfkrafa að gildið sé rétt.

MikilvægtRegex sannreynir ekki merkingu nema þú biður um það

\d{6}-\d{4} athugar bara lögun textans. Ef þú þarft að vita hvort dagur, mánuður og vartala séu gild þarf annaðhvort nákvæmara regex eða venjulegan kóða sem túlkar kennitöluna.

Örlítið strangara mynstur má takmarka dag og mánuð:

(0[1-9]|[12]\d|3[01])(0[1-9]|1[0-2])\d{2}-\d{4}

Lestu það í bútum:

Bútur Merking
(0[1-9]|[12]\d|3[01]) dagur frá 01 til 31
(0[1-9]|1[0-2]) mánuður frá 01 til 12
\d{2} tveir tölustafir fyrir ár
- bandstrik
\d{4} fjórir tölustafir

Æfingar

Skrifaðu mynstur fyrir hvert verkefni og prófaðu það á sýnidæmunum, t.d. í regex101. Reyndu áður en þú opnar lausnina. Hver lausn endar á stuttum kóða sem sannreynir mynstrið: dæmin sem eiga að passa skila TRUE, hin FALSE.

1. Passaðu bara hi.is

Mynstrið á að passa við hi.is en ekki við hiXis.

hi\.is

Punkturinn þarf að vera \. svo hann þýði alvöru punkt en ekki „hvaða stafur sem er“.

daemi <- c("hi.is", "hiXis")
setNames(grepl("hi\\.is", daemi, perl = TRUE), daemi)
hi.is hiXis 
 TRUE FALSE 
# Til samanburðar: mynstrið án bakskástriks
setNames(grepl("hi.is", daemi, perl = TRUE), daemi)
hi.is hiXis 
 TRUE  TRUE 
import re

mynstur = r"hi\.is"
daemi = ["hi.is", "hiXis"]
for s in daemi:
    print(s, bool(re.search(mynstur, s)))
hi.is True
hiXis False
# Til samanburðar: mynstrið án bakskástriks
for s in daemi:
    print(s, bool(re.search(r"hi.is", s)))
hi.is True
hiXis True

2. Símanúmer með eða án bandstriks

Mynstrið á að passa við 555-1234 og 5551234, en ekki við 55-1234 eða 5551-2345.

^\d{3}-?\d{4}$

? gerir bandstrikið valkvætt: núll eða einu sinni. Án ^ og $ myndi mynstrið líka finna 551-2345 inni í 5551-2345.

daemi <- c("555-1234", "5551234", "55-1234", "5551-2345")
setNames(grepl("^\\d{3}-?\\d{4}$", daemi, perl = TRUE), daemi)
 555-1234   5551234   55-1234 5551-2345 
     TRUE      TRUE     FALSE     FALSE 
# Til samanburðar: mynstrið án `^` og `$`
setNames(grepl("\\d{3}-?\\d{4}", daemi, perl = TRUE), daemi)
 555-1234   5551234   55-1234 5551-2345 
     TRUE      TRUE     FALSE      TRUE 
import re

mynstur = r"^\d{3}-?\d{4}$"
daemi = ["555-1234", "5551234", "55-1234", "5551-2345"]
for s in daemi:
    print(s, bool(re.search(mynstur, s)))
555-1234 True
5551234 True
55-1234 False
5551-2345 False
# Til samanburðar: mynstrið án `^` og `$`
for s in daemi:
    print(s, bool(re.search(r"\d{3}-?\d{4}", s)))
555-1234 True
5551234 True
55-1234 False
5551-2345 True

3. Gagnaskrár

Mynstrið á að passa við skráarnöfn sem enda á .csv eða .json, til dæmis gogn.csv og svar.json, en ekki við gogn.csv.bak.

\.(csv|json)$

$ festir mynstrið við endann, þannig að gogn.csv.bak fellur út. Sviginn og | þýða „annaðhvort csv eða json“. Meira um sviga í Hópar og notkun.

daemi <- c("gogn.csv", "svar.json", "gogn.csv.bak")
setNames(grepl("\\.(csv|json)$", daemi, perl = TRUE), daemi)
    gogn.csv    svar.json gogn.csv.bak 
        TRUE         TRUE        FALSE 
import re

mynstur = r"\.(csv|json)$"
daemi = ["gogn.csv", "svar.json", "gogn.csv.bak"]
for s in daemi:
    print(s, bool(re.search(mynstur, s)))
gogn.csv True
svar.json True
gogn.csv.bak False

4. Markdown-fyrirsagnir

Mynstrið á að passa við línur sem byrja á einu til þremur # og svo bili, t.d. # Titill, ## Undirfyrirsögn og ### Undirundirfyrirsögn, en ekki við #### Of djúpt eða #Enginbil.

^#{1,3}\s

^ festir við byrjun línu, #{1,3} leyfir einn til þrjá #, og \s krefst bils á eftir. {1,3} er bil, ekki upptalning: ## passar líka.

daemi <- c("# Titill", "## Undirfyrirsögn", "### Undirundirfyrirsögn", "#### Of djúpt", "#Enginbil")
setNames(grepl("^#{1,3}\\s", daemi, perl = TRUE), daemi)
               # Titill       ## Undirfyrirsögn ### Undirundirfyrirsögn 
                   TRUE                    TRUE                    TRUE 
          #### Of djúpt               #Enginbil 
                  FALSE                   FALSE 
# Til samanburðar: „einn eða þrír“ missir af `##`
setNames(grepl("^(#|###)\\s", daemi, perl = TRUE), daemi)
               # Titill       ## Undirfyrirsögn ### Undirundirfyrirsögn 
                   TRUE                   FALSE                    TRUE 
          #### Of djúpt               #Enginbil 
                  FALSE                   FALSE 
# Til samanburðar: ekkert efra mark hleypir `####` í gegn
setNames(grepl("^#+\\s", daemi, perl = TRUE), daemi)
               # Titill       ## Undirfyrirsögn ### Undirundirfyrirsögn 
                   TRUE                    TRUE                    TRUE 
          #### Of djúpt               #Enginbil 
                   TRUE                   FALSE 
import re

mynstur = r"^#{1,3}\s"
daemi = ["# Titill", "## Undirfyrirsögn", "### Undirundirfyrirsögn", "#### Of djúpt", "#Enginbil"]
for s in daemi:
    print(s, bool(re.search(mynstur, s)))
# Titill True
## Undirfyrirsögn True
### Undirundirfyrirsögn True
#### Of djúpt False
#Enginbil False
# Til samanburðar: „einn eða þrír“ missir af `##`
for s in daemi:
    print(s, bool(re.search(r"^(#|###)\s", s)))
# Titill True
## Undirfyrirsögn False
### Undirundirfyrirsögn True
#### Of djúpt False
#Enginbil False
# Til samanburðar: ekkert efra mark hleypir `####` í gegn
for s in daemi:
    print(s, bool(re.search(r"^#+\s", s)))
# Titill True
## Undirfyrirsögn True
### Undirundirfyrirsögn True
#### Of djúpt True
#Enginbil False

5. Ártal frá 2000 til 2029

Mynstrið á að passa við 2000, 2026 og 2029, en ekki við 1999, 2030 eða 20260.

^20[0-2]\d$

Þriðji stafurinn er 0, 1 eða 2 ([0-2]), sá fjórði hvaða tölustafur sem er (\d). ^ og $ koma í veg fyrir að lengri tölur eins og 20260 passi.

daemi <- c("2000", "2026", "2029", "1999", "2030", "20260")
setNames(grepl("^20[0-2]\\d$", daemi, perl = TRUE), daemi)
 2000  2026  2029  1999  2030 20260 
 TRUE  TRUE  TRUE FALSE FALSE FALSE 
import re

mynstur = r"^20[0-2]\d$"
daemi = ["2000", "2026", "2029", "1999", "2030", "20260"]
for s in daemi:
    print(s, bool(re.search(mynstur, s)))
2000 True
2026 True
2029 True
1999 False
2030 False
20260 False