Preskoči na vsebino
TextArray

Regex goljufija

Regularni izrazi so dovolj kompaktni, da je sintakso lažje poiskati kot si jo zapomniti. Ta stran je vse na enem zaslonu – razredi, kvantifikatorji, sidra, skupine, pogled naokoli, pobeg in zastavice – z delujočim primerom za vsako vrstico.

Okus je JavaScript, ki se izvaja v vašem brskalniku in uporablja preizkuševalec regularnih izrazov na tem spletnem mestu. Večina je identična v Pythonu, Javi, Go in PCRE; kjer se okusi razlikujejo, se razlikujejo na robovih — podpora za pogled nazaj, sintaksa poimenovane skupine in ali \d pomeni "številko ASCII" ali "katero koli številko Unicode".

Dve stvari predstavljata večino presenečenj. Kvantifikatorji so požrešni: vzamejo vse, kar lahko, in vrnejo šele, ko preostali vzorec odpove, zato <.+> pogoltne dve oznaki, <.+?> pa ne. In alternacija je najbolj ohlapna od vseh, tako da ^a|b$ pomeni "začne se z a ali konča z b" - ni tisto, kar večina ljudi namerava napisati.

Razredi znakov

Okrajšave so samo za ASCII, razen če dodate zastavico u in uporabite ubežne znake lastnosti Unicode.

SintaksaPomenPrimer
.Kateri koli znak razen preloma vrsticeDodajte zastavico s, da se ujema tudi z novo vrstico./a.c/"abc" → "abc"
\dŠtevilka, 0–9/\d+/"order 42" → "42"
\DVse, kar ni številka/\D+/"42abc" → "abc"
\wČrka, številka ali podčrtajSamo ASCII — "é" ni \w./\w+/"user_1!" → "user_1"
\WKarkoli \w se ne ujema/\W+/"a++b" → "++"
\sVsak presledek, vključno z zavihki in novimi vrsticami/\s+/"a \t b" → " \t "
\SKateri koli znak, ki ni presledek/\S+/" hi" → "hi"
[abc]Kateri koli od navedenih znakov/[aeiou]/"rhythm and" → "a"
[^abc]Kateri koli znak razen navedenih/[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]Razpon znakov/[a-f]+/"zzabcz" → "abc"
\p{L}Katera koli črka Unicode (potrebuje zastavico u)/\p{L}+/"42 café" → "café"

Kvantifikatorji

Vsi ti so privzeto pohlepni: vzamejo, kolikor lahko, in vrnejo le, če preostali vzorec ne uspe.

SintaksaPomenPrimer
*Nič ali več/ab*/"a" → "a"
+Eno ali več/ab+/"abbb" → "abbb"
?Nič ali ena — ni obvezna/colou?r/"color" → "color"
{3}Točno tri/\d{3}/"id 12345" → "123"
{2,}Dva ali več/a{2,}/"aaa" → "aaa"
{2,4}Med dvema in štirimi/a{2,4}/"aaaaa" → "aaaa"
*?Leni — vzame čim manjPohlepni <.+> bi pogoltnil oba taga./<.+?>/"<a><b>" → "<a>"

Sidra in meje

Te se ujemajo s položajem, ne z značajem, 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 ustavi "cat" ujemanje znotraj "concatenate"./\bcat\b/"the cat sat" → "cat"
\BBrez besedne meje/\Bcat/"concatenate" → "cat"

Skupine in menjava

SintaksaPomenPrimer
(abc)Zajemanje skupine — zapomni si za zamenjavo/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Združevanje brez zajemanjaUporabite to, ko potrebujete samo združevanje; ohranja zajete številke smiselne./(?:ab)+/"abab" → "abab"
(?<name>…)Imenovana skupina za zajem/(?<year>\d{4})/"in 2026" → "2026"
a|bNa obeh straneh — menjavaAlternacija ima najnižjo prednost: ^a|b$ je "^a" ali "b$", ne "^(a|b)$"./cat|dog/"one dog" → "dog"
\1Nazaj na prvo skupino/(\w)\1/"letter" → "tt"

Pogled okoli

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

SintaksaPomenPrimer
(?=…)Pogled naprej – sledi tole/\d+(?= kg)/"80 kg" → "80"
(?!…)Negativni pogled naprej – temu ne sledi/\d+(?! kg)/"80 lb" → "80"
(?<=…)Lookbehind — pred tem/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Negativni pogled nazaj - pred tem ni/(?<!\$)\b\d+/"about 40" → "40"

beg

Teh dvanajst znakov je tistih, ki potrebujejo poševnico nazaj, da jih razumemo dobesedno.

SintaksaPomenPrimer
\.Dobesedna pika/\d\.\d/"v2.5" → "2.5"
\\Dobesedna poševnica nazaj/\\/"C:\\dir" → "\\"
\nPomik vrstice/a\nb/"a\nb" → "a\nb"
\tZavihek/a\tb/"a\tb" → "a\tb"
\uFFFFZnak po kodni točki/\u00e9/"café" → "é"

Zastave

ZastavaImePomen
gGlobalnoPoiščite vsako ujemanje, ne le prvega.
iPrezri velike in male črkeUjemanje ne glede na velike ali male črke.
mVeč vrsticUjemata se ^ in $ pri vsakem prelomu vrstice namesto samo na koncih niza.
sPika na vseNaj . tudi prelomi vrstic tekem.
uUnicodeVzorec obravnava kot kodne točke in omogoči ubežne lastnosti \p{…}.
yLepljivoUjema se samo pri točno zadnjem indeksu, nikoli ne išče naprej.

FAQ

Kakšna je razlika med pohlepnimi in lenimi kvantifikatorji?
Pohlepni kvantifikatorji (*, +, {2,}) se čim bolj ujemajo in vračajo znake le, če se preostali del vzorca ne ujema. Dodajanje? jih naredi lene: ujemajo se čim manj in vzamejo več le, ko so prisiljeni. Na "<a><b>" vzorec <.+> vrne celoten niz in <.+?> vrne samo <a>.
Zakaj se moja beseda ujema z drugimi besedami?
Ker ga ni nič zasidralo. Zavijte besedo v \b — /\bcat\b/ se ujema z "cat" v "the cat sat", vendar ne znotraj "concatenate". \b se ujema s položajem med besednim znakom in nebesednim znakom, tako da ne porabi ničesar.
Kaj spremeni zastava u?
Poskrbi, da vzorec deluje na kodnih točkah in ne na enotah UTF-16, tako da en sam emoji šteje kot en znak, in omogoča ubežne lastnosti \p{…}, kot je \p{L} za "katero koli črko". Brez tega \w in \d ostaneta samo ASCII, zato se "café" ne ujema popolnoma z /\w+/.
Kdaj naj uporabim skupino brez zajemanja?
Kadarkoli potrebujete združevanje, ne pa tudi zajetega besedila — (?:ab)+ namesto (ab)+. Zajemi stanejo malo, vendar je pravi razlog oštevilčevanje: vsaka zajemna skupina, ki jo dodate, premakne številke tistih za njo in tiho prekine zamenjave, ki uporabljajo $1 in $2.
Je lookbehind varen za uporabo?
V trenutnih brskalnikih in Node, da — (?<=…) in (?<!…) sta podprta v vseh večjih motorjih od leta 2018. Safari je bil zadnji, ki ga je dodal. Če ciljate na zelo stare izvajalne čase, najprej preverite; za sintakso regularnega izraza ni polifilla.