Sări la conținut
TextArray

Cheatsheet Regex

Expresiile regulate sunt suficient de compacte încât sintaxa să fie mai ușor de căutat decât de memorat. Această pagină este întregul ei pe un singur ecran - clase, cuantificatori, ancore, grupuri, privire în jur, evadare și steaguri - cu un exemplu de lucru pentru fiecare rând.

Aroma este JavaScript, care este ceea ce rulează în browser și ceea ce folosește testerul regex de pe acest site. Cea mai mare parte este identică în Python, Java, Go și PCRE; acolo unde aromele diferă, ele diverg pe margini — suport de căutare în urmă, sintaxa grupului numit și dacă \d înseamnă „cifră ASCII” sau „orice cifră Unicode”.

Două lucruri reprezintă majoritatea surprizelor. Cuantificatorii sunt lacomi: iau tot ce pot și returnează numai atunci când restul modelului eșuează, motiv pentru care <.+> înghite două etichete și <.+?> nu. Iar alternanța leagă cel mai liber dintre toate, așa că ^a|b$ înseamnă „începe cu a sau se termină cu b” – nu ceea ce intenționează majoritatea oamenilor când o scriu.

Clasele de caractere

Scurtarea sunt doar ASCII, cu excepția cazului în care adăugați steag-ul u și utilizați escape-uri de proprietate Unicode.

SintaxăSensExemplu
.Orice caracter, cu excepția unei întreruperi de linieAdăugați steagul s pentru a se potrivi și cu liniile noi./a.c/"abc" → "abc"
\dO cifră, 0–9/\d+/"order 42" → "42"
\DOrice care nu este o cifră/\D+/"42abc" → "abc"
\wLiteră, cifră sau liniuță de subliniereNumai ASCII — „é” nu este \w./\w+/"user_1!" → "user_1"
\WOrice \w nu se potrivește/\W+/"a++b" → "++"
\sOrice spațiu alb, inclusiv file și linii noi/\s+/"a \t b" → " \t "
\SOrice caracter fără spații albe/\S+/" hi" → "hi"
[abc]Oricare dintre personajele enumerate/[aeiou]/"rhythm and" → "a"
[^abc]Orice personaj, cu excepția celor enumerate/[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]O serie de personaje/[a-f]+/"zzabcz" → "abc"
\p{L}Orice literă Unicode (are nevoie de steagul u)/\p{L}+/"42 café" → "café"

Cuantificatori

Toate acestea sunt lacome în mod implicit: iau cât pot și dau înapoi numai dacă restul modelului eșuează.

SintaxăSensExemplu
*Zero sau mai mult/ab*/"a" → "a"
+Una sau mai multe/ab+/"abbb" → "abbb"
?Zero sau unu - îl face opțional/colou?r/"color" → "color"
{3}Exact trei/\d{3}/"id 12345" → "123"
{2,}Două sau mai multe/a{2,}/"aaa" → "aaa"
{2,4}Între doi și patru/a{2,4}/"aaaaa" → "aaaa"
*?Leneș — ia cât mai puțin posibilLacomul <.+> ar înghiți ambele etichete./<.+?>/"<a><b>" → "<a>"

Ancore și limite

Acestea se potrivesc cu o poziție, nu cu un personaj, așa că nu consumă nimic.

SintaxăSensExemplu
^Începutul șirului sau al unei linii cu steagul m/^a/"abc" → "a"
$Sfârșitul șirului sau al unei linii cu steagul m/c$/"abc" → "c"
\bO limită de cuvinteAcesta este ceea ce oprește potrivirea „pisica” în interiorul „concatenate”./\bcat\b/"the cat sat" → "cat"
\BNici o limită de cuvânt/\Bcat/"concatenate" → "cat"

Grupuri și alternanță

SintaxăSensExemplu
(abc)Grup de capturare - reținut pentru înlocuire/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Gruparea fără capturăUtilizați acest lucru atunci când aveți nevoie doar de grupare; păstrează semnificative numerele de captură./(?:ab)+/"abab" → "abab"
(?<name>…)Grup de capturare numit/(?<year>\d{4})/"in 2026" → "2026"
a|bOricare parte - alternanțăAlternarea are cea mai mică prioritate: ^a|b$ este „^a” sau „b$”, nu „^(a|b)$”./cat|dog/"one dog" → "dog"
\1Referință la primul grup/(\w)\1/"letter" → "tt"

Privește în jur

Afirmații despre ceea ce înconjoară o poziție. Nu se potrivesc cu nimic ei înșiși, ceea ce îi face sigur de combinat.

SintaxăSensExemplu
(?=…)Privește înainte - urmat de asta/\d+(?= kg)/"80 kg" → "80"
(?!…)Perspectivă negativă - nu este urmată de aceasta/\d+(?! kg)/"80 lb" → "80"
(?<=…)Privește în urmă — precedat de aceasta/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Privire negativă în urmă — neprecedată de aceasta/(?<!\$)\b\d+/"about 40" → "40"

Evadare

Aceste douăsprezece personaje sunt cele care au nevoie de o bară oblică inversă pentru a fi luate la propriu.

SintaxăSensExemplu
\.Un punct literal/\d\.\d/"v2.5" → "2.5"
\\O bară oblică inversă/\\/"C:\\dir" → "\\"
\nUn avans de linie/a\nb/"a\nb" → "a\nb"
\tO filă/a\tb/"a\tb" → "a\tb"
\uFFFFUn caracter prin punctul său de cod/\u00e9/"café" → "é"

Steaguri

PavilionNumeSens
gGlobalGăsiți fiecare potrivire, nu doar prima.
iIgnora majusculelePotriviți indiferent de litere mari sau mici.
mMultilinieFace ca ^ și $ să se potrivească la fiecare întrerupere de linie în loc de numai la sfârșitul șirului.
sPunct toateSă . se întrerupe și linia meciului.
uUnicodeTratează modelul ca puncte de cod și permite scăpările de proprietate \p{…}.
yLipiciosSe potrivește doar exact la lastIndex, fără a căuta niciodată înainte.

FAQ

Care este diferența dintre cuantificatorii lacomi și leneși?
Cuantificatorii greedy (*, +, {2,}) se potrivesc cât mai mult posibil și dau caractere înapoi numai atunci când restul modelului nu se potrivește. Adăugând? ii lenevesc: se potrivesc cat mai putin si iau mai mult doar atunci cand sunt fortati. Pe „<a><b>”, modelul <.+> returnează întregul șir și <.+?> returnează doar <a>.
De ce se potrivește cuvântul meu în interiorul altor cuvinte?
Pentru că nimic nu l-a ancorat. Înveliți cuvântul în \b — /\bcat\b/ se potrivește cu „pisica” în „pisica așezată”, dar nu în interiorul „concatenate”. \b potrivește o poziție între un caracter de cuvânt și unul non-cuvânt, deci nu consumă nimic.
Ce se schimbă steagul u?
Face ca modelul să funcționeze mai degrabă pe puncte de cod decât pe unități UTF-16, astfel încât un singur emoji contează ca un caracter și permite evadari de proprietate \p{…}, cum ar fi \p{L} pentru „orice literă”. Fără el, \w și \d rămân doar ASCII, motiv pentru care „café” nu se potrivește pe deplin cu /\w+/.
Când ar trebui să folosesc un grup care nu captează?
Ori de câte ori aveți nevoie de grupare, dar nu de textul capturat — (?:ab)+ în loc de (ab)+. Capturile costă puțină performanță, dar adevăratul motiv este numerotarea: fiecare grup de captură pe care îl adăugați schimbă numerele celor de după el, rupând în liniște înlocuirile care folosesc $1 și $2.
Lookbehind este sigur de utilizat?
În browserele și Node actuale, da — (?<=…) și (?<!…) au fost acceptate în toate motorurile majore din 2018. Safari a fost ultimul care l-a adăugat. Dacă vizați timpi de execuție foarte vechi, verificați mai întâi; nu există polyfill pentru sintaxa regex.