Sări la conținut

Fișă de referință regex

Expresiile regulate sunt suficient de compacte încât sintaxa este mai ușor de consultat decât de memorat. Această pagină o cuprinde în întregime pe un singur ecran — clase, cuantificatori, ancore, grupuri, lookaround, escapare și flag-urile — cu un exemplu funcțional pentru fiecare rând.

Varianta este JavaScript, cea care rulează în browserul tău și pe care o folosește testerul de regex de pe acest site. Cea mai mare parte este identică în Python, Java, Go și PCRE; acolo unde variantele diferă, diferă la margini — suportul pentru lookbehind, sintaxa grupurilor denumite și dacă \d înseamnă „cifră ASCII" sau „orice cifră Unicode".

Două lucruri explică majoritatea surprizelor. Cuantificatorii sunt lacomi: iau tot ce pot și cedează abia când restul tiparului dă greș, de aceea <.+> înghite două etichete, iar <.+?> nu. Iar alternarea are cea mai slabă prioritate 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.

Clase de caractere

11

Prescurtările sunt doar ASCII, cu excepția cazului în care adaugi flag-ul u și folosești escapări de proprietate Unicode.

SintaxăSemnificațieExemplu
.Orice caracter, cu excepția unei întreruperi de linieAdaugă flag-ul s pentru a-l face să potrivească și liniile noi./a.c/"abc" "abc"
\dO cifră, 0–9/\d+/"order 42" "42"
\DOrice nu este o cifră/\D+/"42abc" "abc"
\wLiteră, cifră sau underscoreDoar ASCII — „é" nu este \w./\w+/"user_1!" "user_1"
\WOrice nu potrivește \w/\W+/"a++b" "++"
\sOrice spațiu alb, inclusiv taburi și linii noi/\s+/"a \t b" " \t "
\SOrice caracter care nu este spațiu alb/\S+/" hi" "hi"
[abc]Oricare dintre caracterele listate/[aeiou]/"rhythm and" "a"
[^abc]Orice caracter, cu excepția celor listate/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Un interval de caractere/[a-f]+/"zzabcz" "abc"
\p{L}Orice literă Unicode (necesită flag-ul u)/\p{L}+/"42 café" "café"

Cuantificatori

7

Toți aceștia sunt lacomi în mod implicit: iau cât mai mult pot și cedează abia dacă restul tiparului dă greș.

SintaxăSemnificațieExemplu
*Zero sau mai multe/ab*/"a" "a"
+Una sau mai multe/ab+/"abbb" "abbb"
?Zero sau una — o 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 două ș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

4

Acestea potrivesc o poziție, nu un caracter, deci nu consumă nimic.

SintaxăSemnificațieExemplu
^Începutul șirului sau al unei linii cu flag-ul m/^a/"abc" "a"
$Sfârșitul șirului sau al unei linii cu flag-ul m/c$/"abc" "c"
\bO limită de cuvântAceasta este ceea ce împiedică „cat" să se potrivească în interiorul lui „concatenate"./\bcat\b/"the cat sat" "cat"
\BNu este o limită de cuvânt/\Bcat/"concatenate" "cat"

Grupuri și alternare

5
SintaxăSemnificațieExemplu
(abc)Grup de capturare — reținut pentru înlocuire/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Grupare fără capturareFolosește-l când ai nevoie doar de grupare; păstrează numerele de capturare semnificative./(?:ab)+/"abab" "abab"
(?<name>…)Grup de capturare denumit/(?<year>\d{4})/"in 2026" "2026"
a|bOricare parte — alternareAlternarea are cea mai mică prioritate: ^a|b$ înseamnă „^a" sau „b$", nu „^(a|b)$"./cat|dog/"one dog" "dog"
\1Referință inversă către primul grup/(\w)\1/"letter" "tt"

Lookaround

4

Aserțiuni despre ceea ce înconjoară o poziție. Ele însele nu potrivesc nimic, ceea ce le face sigure de combinat.

SintaxăSemnificațieExemplu
(?=…)Lookahead — urmat de aceasta/\d+(?= kg)/"80 kg" "80"
(?!…)Lookahead negativ — nu este urmat de aceasta/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — precedat de aceasta/(?<=\$)\d+/"costs $40" "40"
(?<!…)Lookbehind negativ — nu este precedat de aceasta/(?<!\$)\b\d+/"about 40" "40"

Escapare

5

Aceste douăsprezece caractere sunt cele care au nevoie de o bară oblică inversă pentru a fi luate literal.

SintaxăSemnificațieExemplu
\.Un punct literal/\d\.\d/"v2.5" "2.5"
\\O bară oblică inversă literală/\\/"C:\\dir" "\\"
\nUn salt de linie/a\nb/"a\nb" "a\nb"
\tUn tab/a\tb/"a\tb" "a\tb"
\uFFFFUn caracter dat prin punctul său de cod/\u00e9/"café" "é"

Flag-uri

6
FlagDenumireSemnificație
gGlobalGăsește fiecare potrivire, nu doar prima.
iIgnoră majusculele/minusculelePotrivește indiferent de majuscule sau minuscule.
mMultilineFace ca ^ și $ să potrivească la fiecare întrerupere de linie, nu doar la capetele șirului.
sDot allPermite ca . să potrivească și întreruperile de linie.
uUnicodeTratează tiparul ca puncte de cod și activează escapările de proprietate \p{…}.
yStickyPotrivește doar exact la lastIndex, fără a căuta mai departe.

FAQ

Care este diferența dintre cuantificatorii lacomi și cei leneși?
Cuantificatorii lacomi (*, +, {2,}) potrivesc cât mai mult posibil și cedează caractere abia când restul tiparului nu se poate potrivi. Adăugarea lui ? îi face leneși: potrivesc cât mai puțin posibil și iau mai mult doar când sunt forțați. Pe „<a><b>", tiparul <.+> returnează întregul șir, iar <.+?> returnează doar <a>.
De ce se potrivește cuvântul meu în interiorul altor cuvinte?
Pentru că nu l-a ancorat nimic. Încadrează cuvântul în \b — /\bcat\b/ potrivește „cat" în „the cat sat", dar nu în interiorul lui „concatenate". \b potrivește o poziție între un caracter de cuvânt și unul care nu este de cuvânt, deci nu consumă nimic.
Ce modifică flag-ul u?
Face ca tiparul să opereze pe puncte de cod în loc de unități UTF-16, așa că un singur emoji contează ca un caracter, și activează escapările de proprietate \p{…}, precum \p{L} pentru „orice literă". Fără el, \w și \d rămân doar ASCII, motiv pentru care „café" nu se potrivește complet cu /\w+/.
Când ar trebui să folosesc un grup care nu capturează?
Ori de câte ori ai nevoie de grupare, dar nu de textul capturat — (?:ab)+ în loc de (ab)+. Capturile costă puțină performanță, dar motivul real este numerotarea: fiecare grup de capturare pe care îl adaugi deplasează numerele celor de după el, stricând în tăcere înlocuirile care folosesc $1 și $2.
Este lookbehind sigur de utilizat?
În browserele actuale și Node, da — (?<=…) și (?<!…) sunt suportate de fiecare motor major din 2018. Safari a fost ultimul care l-a adăugat. Dacă țintești medii de execuție foarte vechi, verifică mai întâi; nu există niciun polyfill pentru sintaxa regex.