Preskoči na vsebino

Pregled regularnih izrazov

Regularni izrazi so dovolj strnjeni, da je sintakso lažje poiskati kot si jo zapomniti. Ta stran je vsa na enem zaslonu — razredi, kvantifikatorji, sidra, skupine, lookaround, escapiranje in zastavice — z delujočim primerom za vsako vrstico.

Različica je JavaScript, kar teče v vašem brskalniku in kar uporablja preizkuševalnik regularnih izrazov na tem mestu. Večina je enaka v Pythonu, Javi, Go in PCRE; kjer se različice razhajajo, se razhajajo na robovih — podpora za lookbehind, sintaksa poimenovanih skupin in ali \d pomeni »števko ASCII« ali »katero koli števko Unicode«.

Dve stvari sta kriva za večino presenečenj. Kvantifikatorji so požrešni: vzamejo vse, kar lahko, in vračajo šele, ko preostanek vzorca ne uspe, zato <.+> pogoltne dve oznaki, <.+?> pa ne. In alternacija veže najšibkeje od vsega, tako da ^a|b$ pomeni »se začne z a ali se konča z b« — ne tisto, kar večina ljudi namerava, ko to napiše.

Znakovni razredi

11

Okrajšave delujejo le v ASCII, razen če dodate zastavico u in uporabite lastnostna ubežna zaporedja Unicode.

SintaksaPomenPrimer
.Kateri koli znak razen preloma vrsticeDodajte zastavico s, da se ujema tudi z novimi vrsticami./a.c/"abc" "abc"
\dŠtevka, 0–9/\d+/"order 42" "42"
\DKarkoli, kar ni števka/\D+/"42abc" "abc"
\wČrka, števka ali podčrtajSamo ASCII — »é« ni \w./\w+/"user_1!" "user_1"
\WKarkoli, s čimer se \w ne ujema/\W+/"a++b" "++"
\sKateri koli presledni znak, vključno s tabulatorji in novimi vrsticami/\s+/"a \t b" " \t "
\SKateri koli nepresledni znak/\S+/" hi" "hi"
[abc]Kateri koli od naštetih znakov/[aeiou]/"rhythm and" "a"
[^abc]Kateri koli znak razen naštetih/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Obseg znakov/[a-f]+/"zzabcz" "abc"
\p{L}Katera koli črka Unicode (potrebuje zastavico u)/\p{L}+/"42 café" "café"

Kvantifikatorji

7

Vsi ti so privzeto požrešni: vzamejo čim več in vračajo le, če preostanek vzorca ne uspe.

SintaksaPomenPrimer
*Nič ali več/ab*/"a" "a"
+Eden ali več/ab+/"abbb" "abbb"
?Nič ali eden — naredi izbirno/colou?r/"color" "color"
{3}Natanko trije/\d{3}/"id 12345" "123"
{2,}Dva ali več/a{2,}/"aaa" "aaa"
{2,4}Med dva in štiri/a{2,4}/"aaaaa" "aaaa"
*?Leno — vzame čim manjPožrešni <.+> bi pogoltnil obe oznaki./<.+?>/"<a><b>" "<a>"

Sidra in meje

4

Ti se ujemajo s položajem, ne z znakom, zato ne porabijo ničesar.

SintaksaPomenPrimer
^Začetek niza ali vrstice z zastavico m/^a/"abc" "a"
$Konec niza ali vrstice z zastavico m/c$/"abc" "c"
\bBesedna mejaTo je tisto, kar prepreči, da bi se »cat« ujemal znotraj »concatenate«./\bcat\b/"the cat sat" "cat"
\BNi besedna meja/\Bcat/"concatenate" "cat"

Skupine in alternacija

5
SintaksaPomenPrimer
(abc)Zajemalna skupina — zapomnjena za zamenjavo/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Združevanje brez zajemanjaUporabite to, kadar potrebujete le združevanje; ohranja smiselnost številk zajemov./(?:ab)+/"abab" "abab"
(?<name>…)Poimenovana zajemalna skupina/(?<year>\d{4})/"in 2026" "2026"
a|bEna ali druga stran — alternacijaAlternacija ima najnižjo prednost: ^a|b$ je »^a« ali »b$«, ne »^(a|b)$«./cat|dog/"one dog" "dog"
\1Povratni sklic na prvo skupino/(\w)\1/"letter" "tt"

Lookaround

4

Trditve o tem, kaj obdaja položaj. Same se ne ujemajo z ničimer, zato jih je varno kombinirati.

SintaksaPomenPrimer
(?=…)Lookahead — sledi mu to/\d+(?= kg)/"80 kg" "80"
(?!…)Negativni lookahead — ne sledi mu to/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — pred njim je to/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negativni lookbehind — pred njim ni tega/(?<!\$)\b\d+/"about 40" "40"

Escapiranje

5

Teh dvanajst znakov potrebuje obrnjeno poševnico, da so vzeti dobesedno.

SintaksaPomenPrimer
\.Dobesedna pika/\d\.\d/"v2.5" "2.5"
\\Dobesedna obrnjena poševnica/\\/"C:\\dir" "\\"
\nPomik v novo vrstico/a\nb/"a\nb" "a\nb"
\tTabulator/a\tb/"a\tb" "a\tb"
\uFFFFZnak po njegovi kodni točki/\u00e9/"café" "é"

Zastavice

6
ZastavicaImePomen
gGlobalnoPoišče vsako ujemanje, ne le prvega.
iPrezri velikost črkUjema se ne glede na velike ali male črke.
mVečvrstičnoNaredi, da se ^ in $ ujemata ob vsakem prelomu vrstice namesto le na koncih niza.
sDotAllOmogoči, da se . ujema tudi s prelomi vrstic.
uUnicodeObravnava vzorec kot kodne točke in omogoči lastnostna ubežna zaporedja \p{…}.
yLepljivoUjema se le natanko pri lastIndex, nikoli ne išče naprej.

FAQ

Kakšna je razlika med požrešnimi in lenimi kvantifikatorji?
Požrešni kvantifikatorji (*, +, {2,}) se ujemajo s čim več in vračajo znake šele, ko se preostanek vzorca ne more ujemati. Dodani ? jih naredi lene: ujamejo čim manj in vzamejo več le, ko so prisiljeni. Pri »<a><b>« vzorec <.+> vrne celoten niz, <.+?> pa vrne le <a>.
Zakaj se moja beseda ujema znotraj drugih besed?
Ker je nič ni zasidralo. Ovijte besedo v \b — /\bcat\b/ se ujema z »cat« v »the cat sat«, ne pa znotraj »concatenate«. \b se ujema s položajem med besednim in nebesednim znakom, zato ne porabi ničesar.
Kaj spremeni zastavica u?
Vzorcu omogoči, da deluje na kodnih točkah namesto na enotah UTF-16, tako da en sam emodži šteje kot en znak, in omogoči lastnostna ubežna zaporedja \p{…}, kot je \p{L} za »katero koli črko«. Brez nje \w in \d ostaneta le ASCII, zato se »café« ne ujema v celoti z /\w+/.
Kdaj naj uporabim nezajemalno skupino?
Kadar koli potrebujete združevanje, a ne zajetega besedila — (?:ab)+ namesto (ab)+. Zajemanja stanejo nekaj zmogljivosti, a pravi razlog je oštevilčenje: vsaka zajemalna skupina, ki jo dodate, premakne številke tistih za njo in tiho pokvari zamenjave, ki uporabljajo $1 in $2.
Ali je lookbehind varno uporabljati?
V trenutnih brskalnikih in Node da — (?<=…) in (?<!…) so podprti v vseh večjih pogonih od leta 2018. Safari ga je dodal zadnji. Če ciljate na zelo stare izvajalnike, najprej preverite; za sintakso regularnih izrazov ni polnila (polyfill).