Preskoči na sadržaj

Regex podsjetnik

Regularni su izrazi dovoljno sažeti da je sintaksu lakše potražiti nego zapamtiti. Ova je stranica cjelina na jednom zaslonu — klase, kvantifikatori, sidra, grupe, lookaround, escapiranje i zastavice — s radnim primjerom za svaki redak.

Varijanta je JavaScript, ono što se izvodi u vašem pregledniku i što koristi regex tester na ovoj stranici. Većina je identična u Pythonu, Javi, Gou i PCRE-u; gdje se varijante razilaze, razilaze se na rubovima — podrška za lookbehind, sintaksa imenovanih grupa i znači li \d "ASCII znamenku" ili "bilo koju Unicode znamenku".

Dvije stvari uzrokuju većinu iznenađenja. Kvantifikatori su pohlepni: uzimaju sve što mogu i vraćaju tek kad ostatak uzorka ne uspije, zbog čega <.+> proguta dvije oznake, a <.+?> ne. A alternacija se veže najslabije od svega, pa ^a|b$ znači "počinje s a, ili završava s b" — ne ono što većina ljudi namjerava kad to napiše.

Klase znakova

11

Kratice su samo ASCII osim ako dodate zastavicu u i koristite Unicode escape sekvence svojstava.

SintaksaZnačenjePrimjer
.Bilo koji znak osim prijeloma retkaDodajte zastavicu s da bi se podudarao i s novim retcima./a.c/"abc" "abc"
\dZnamenka, 0–9/\d+/"order 42" "42"
\DBilo što što nije znamenka/\D+/"42abc" "abc"
\wSlovo, znamenka ili donja crtaSamo ASCII — "é" nije \w./\w+/"user_1!" "user_1"
\WBilo što s čime se \w ne podudara/\W+/"a++b" "++"
\sBilo koji razmak, uključujući tabulatore i nove retke/\s+/"a \t b" " \t "
\SBilo koji znak koji nije razmak/\S+/" hi" "hi"
[abc]Bilo koji od navedenih znakova/[aeiou]/"rhythm and" "a"
[^abc]Bilo koji znak osim navedenih/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Raspon znakova/[a-f]+/"zzabcz" "abc"
\p{L}Bilo koje Unicode slovo (potrebna zastavica u)/\p{L}+/"42 café" "café"

Kvantifikatori

7

Svi su ovi pohlepni prema zadanim postavkama: uzimaju što je više moguće i vraćaju samo ako ostatak uzorka ne uspije.

SintaksaZnačenjePrimjer
*Nula ili više/ab*/"a" "a"
+Jedan ili više/ab+/"abbb" "abbb"
?Nula ili jedan — čini ga neobaveznim/colou?r/"color" "color"
{3}Točno tri/\d{3}/"id 12345" "123"
{2,}Dva ili više/a{2,}/"aaa" "aaa"
{2,4}Između dva i četiri/a{2,4}/"aaaaa" "aaaa"
*?Lijeni — uzima što je manje mogućePohlepni <.+> progutao bi obje oznake./<.+?>/"<a><b>" "<a>"

Sidra i granice

4

Ovi se podudaraju s pozicijom, a ne sa znakom, pa ništa ne troše.

SintaksaZnačenjePrimjer
^Početak niza, ili retka uz zastavicu m/^a/"abc" "a"
$Kraj niza, ili retka uz zastavicu m/c$/"abc" "c"
\bGranica riječiTo je ono što sprječava da se "cat" podudari unutar "concatenate"./\bcat\b/"the cat sat" "cat"
\BNije granica riječi/\Bcat/"concatenate" "cat"

Grupe i alternacija

5
SintaksaZnačenjePrimjer
(abc)Grupa za hvatanje — zapamćena za zamjenu/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Grupiranje bez hvatanjaKoristite ovo kad vam treba samo grupiranje; zadržava značenje brojeva hvatanja./(?:ab)+/"abab" "abab"
(?<name>…)Imenovana grupa za hvatanje/(?<year>\d{4})/"in 2026" "2026"
a|bBilo koja strana — alternacijaAlternacija ima najniži prioritet: ^a|b$ je "^a" ili "b$", a ne "^(a|b)$"./cat|dog/"one dog" "dog"
\1Povratna referenca na prvu grupu/(\w)\1/"letter" "tt"

Lookaround

4

Tvrdnje o tome što okružuje poziciju. Same se ne podudaraju ni s čim, što ih čini sigurnima za kombiniranje.

SintaksaZnačenjePrimjer
(?=…)Lookahead — praćeno ovime/\d+(?= kg)/"80 kg" "80"
(?!…)Negativni lookahead — nije praćeno ovime/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — kojem prethodi ovo/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negativni lookbehind — kojem ne prethodi ovo/(?<!\$)\b\d+/"about 40" "40"

Escapiranje

5

Ovih dvanaest znakova su oni kojima je potrebna obrnuta kosa crta da bi se shvatili doslovno.

SintaksaZnačenjePrimjer
\.Doslovna točka/\d\.\d/"v2.5" "2.5"
\\Doslovna obrnuta kosa crta/\\/"C:\\dir" "\\"
\nPomak retka/a\nb/"a\nb" "a\nb"
\tTabulator/a\tb/"a\tb" "a\tb"
\uFFFFZnak prema svojoj kodnoj točki/\u00e9/"café" "é"

Zastavice

6
ZastavicaNazivZnačenje
gGlobalnoPronađi svako podudaranje, ne samo prvo.
iZanemari velika/mala slovaPodudaranje bez obzira na velika ili mala slova.
mVišerednoČini da se ^ i $ podudaraju na svakom prijelomu retka umjesto samo na krajevima niza.
sDot allDopušta da se . podudara i s prijelomima retka.
uUnicodeTretira uzorak kao kodne točke i omogućuje \p{…} escape sekvence svojstava.
yStickyPodudara se samo točno na lastIndex, nikad ne tražeći unaprijed.

FAQ

Koja je razlika između pohlepnih i lijenih kvantifikatora?
Pohlepni kvantifikatori (*, +, {2,}) podudaraju se sa što je više moguće i vraćaju znakove tek kad se ostatak uzorka ne može podudariti. Dodavanje ? čini ih lijenima: podudaraju se sa što je manje moguće i uzimaju više tek kad su prisiljeni. Na "<a><b>", uzorak <.+> vraća cijeli niz, a <.+?> vraća samo <a>.
Zašto se moja riječ podudara unutar drugih riječi?
Zato što je ništa nije usidrilo. Omotajte riječ u \b — /\bcat\b/ podudara se s "cat" u "the cat sat", ali ne unutar "concatenate". \b se podudara s pozicijom između znaka riječi i znaka koji nije riječ, pa ništa ne troši.
Što mijenja zastavica u?
Čini da uzorak radi na kodnim točkama umjesto na UTF-16 jedinicama, pa se pojedinačni emoji broji kao jedan znak, i omogućuje \p{…} escape sekvence svojstava kao što je \p{L} za "bilo koje slovo". Bez nje, \w i \d ostaju samo ASCII, zbog čega se "café" ne podudara u potpunosti s /\w+/.
Kada trebam koristiti grupu koja ne hvata?
Kad god vam treba grupiranje, ali ne i uhvaćeni tekst — (?:ab)+ umjesto (ab)+. Hvatanja koštaju malo performansi, ali pravi je razlog numeriranje: svaka grupa za hvatanje koju dodate pomiče brojeve onih nakon nje, tiho lomeći zamjene koje koriste $1 i $2.
Je li lookbehind sigurno koristiti?
U trenutačnim preglednicima i Nodeu, da — (?<=…) i (?<!…) podržani su u svim glavnim mehanizmima od 2018. Safari ga je dodao posljednji. Ako ciljate vrlo stara okruženja za izvođenje, prvo provjerite; ne postoji polyfill za sintaksu regularnih izraza.