Expresii regulate pentru oameni: Un ghid practic
Expresiile regulate (regex) au o problemă de imagine. Arată ca și cum cineva a adormit pe tastatură: ^[\w.-]+@[\w-]+\.[\w.]+$. Apar în revizuiri de cod, editoare de text, instrumente de căutare și validare de formulare. Dezvoltatorii fie le iubesc, fie le evită complet.
Adevărul este undeva la mijloc. Regex-ul este cu adevărat puternic. Este și cu adevărat confuz la început. Dar nu trebuie să stăpânești fiecare caracteristică obscură pentru a obține valoare practică. O mână de tipare acoperă marea majoritate a cazurilor de utilizare din lumea reală.
Ce face efectiv regex-ul
O expresie regulată este un tipar care descrie un set de șiruri de caractere. O dai unui instrument de căutare și acesta găsește fiecare șir care se potrivește cu tiparul. Gândește-te la el ca la o interogare de căutare foarte precisă.
Căutare normală: găsește exact „salut" Căutare regex: găsește orice care arată ca o adresă de email, un număr de telefon, o dată, un URL sau orice alt tipar pe care îl poți descrie.
Știai că? Expresiile regulate au fost inventate de matematicianul Stephen Kleene în 1956 ca notație pentru descrierea „limbajelor regulate" în teoria formală a limbajelor. Au intrat în informatică prin editorii de text Unix timpurii din anii 1960 și 1970.
Elementele de bază
Caractere literale
Cel mai simplu regex este pur și simplu text literal. Tiparul salut se potrivește cu șirul „salut." Nimic complicat.
Punctul (.) — Orice caracter unic
Un punct se potrivește cu orice caracter unic (cu excepția unui rând nou).
h.tse potrivește cu „hat," „hit," „hot," „hut," și chiar „h3t"
Clase de caractere ([]) — Caractere specifice
Parantezele pătrate definesc un set de caractere permise la acea poziție.
[aeiou]se potrivește cu orice vocală singulară[0-9]se potrivește cu orice cifră[A-Za-z]se potrivește cu orice literă (majusculă sau minusculă)[^0-9]se potrivește cu orice caracter care NU este o cifră (^în interiorul parantezelor înseamnă „nu")
Cuantificatori — Câte
Aceste simboluri controlează repetiția:
| Simbol | Semnificație | Exemplu | Se potrivește cu |
|---|---|---|---|
* |
Zero sau mai multe | ab*c |
„ac," „abc," „abbc," „abbbc" |
+ |
Unul sau mai multe | ab+c |
„abc," „abbc," „abbbc" (nu „ac") |
? |
Zero sau unul | colou?r |
„color" și „colour" |
{3} |
Exact 3 | a{3} |
„aaa" |
{2,4} |
Între 2 și 4 | a{2,4} |
„aa," „aaa," „aaaa" |
Ancore — Poziție
^la început înseamnă „începutul șirului"$la final înseamnă „sfârșitul șirului"^salut$se potrivește doar cu exact șirul „salut," nu cu „spune salut" sau „salut lume"
Clase prescurtate
Clasele frecvente de caractere au scurtături:
| Prescurtare | Echivalent | Semnificație |
|---|---|---|
\d |
[0-9] |
Orice cifră |
\w |
[A-Za-z0-9_] |
Orice caracter „word" |
\s |
[ \t\n\r] |
Orice spațiu alb |
\D |
[^0-9] |
Orice non-cifră |
\W |
[^A-Za-z0-9_] |
Orice caracter non-word |
\S |
[^ \t\n\r] |
Orice non-spațiu alb |
Grupuri (()) — Grupare și capturare
Parantezele grupează părți ale unui tipar. Aceasta este utilă pentru aplicarea cuantificatorilor unui grup sau pentru extragerea unor părți specifice ale unui meci.
(ab)+se potrivește cu „ab," „abab," „ababab"(\d{3})-(\d{4})se potrivește cu „555-1234" și capturează „555" și „1234" separat
Bara verticală (|) — Sau
Bara verticală înseamnă „sau."
pisică|câinese potrivește cu „pisică" sau „câine"(jpg|png|gif)se potrivește cu oricare dintre aceste trei extensii de imagine
Tipare practice pe care le poți folosi astăzi
Potrivirea unei adrese de email (simplă)
[\w.-]+@[\w-]+\.[\w.]+
Detaliat:
[\w.-]+— unul sau mai multe caractere word, puncte sau liniuțe (partea locală)@— semnul @ literal[\w-]+— unul sau mai multe caractere word sau liniuțe (domeniul)\.— punct literal (escapat deoarece.este un caracter special)[\w.]+— unul sau mai multe caractere word sau puncte (TLD)
Atenție Validarea email-urilor cu regex este notorie dificil de realizat perfect. Tiparul simplu de mai sus acoperă 99% din adresele de email din lumea reală, dar nu gestionează fiecare caz marginal definit în specificația RFC. Pentru validare în producție, folosește biblioteca de validare a email-urilor din limbajul tău de programare.
Potrivirea unui număr de telefon (format US)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Aceasta se potrivește cu:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Potrivirea unui URL
https?://[\w.-]+(/[\w./-]*)?
Aceasta se potrivește cu:
Potrivirea unei date (AAAA-LL-ZZ)
\d{4}-\d{2}-\d{2}
Aceasta se potrivește cu: 2026-03-23, 1999-12-31, etc.
Găsirea cuvintelor duplicate
\b(\w+)\s+\1\b
Aceasta se potrivește cu cuvinte repetate precum „the the" sau „is is." \1 face referire la ceea ce a fost capturat de primul grup.
Potrivirea unei adrese IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Aceasta se potrivește cu tipare precum 192.168.1.1 sau 10.0.0.255.
Sfaturi pentru scrierea regex-ului
1. Începe simplu, apoi rafinează
Nu încerca să scrii regex-ul perfect din prima încercare. Începe cu un tipar larg, testează-l pe datele tale și restrânge-l.
2. Testează întotdeauna
Regex-ul este ușor de greșit. Un cuantificator lipsă sau un punct neescapat poate schimba complet ce se potrivește. Testează întotdeauna tiparul pe date din lumea reală înainte de a-l folosi în producție.
3. Escapezi caracterele speciale
Dacă trebuie să se potrivească cu un punct literal, paranteză, paranteze pătrate sau alt caracter special, escapează-l cu o bară oblică inversă: \., \(, \[.
4. Folosești comentarii și grupuri denumite
În tipare complexe, folosește grupuri denumite și comentarii (unde este suportat) pentru a face regex-ul lizibil. Viitorul tu îți va mulțumi.
5. Știi când să NU folosești regex-ul
Regex-ul este instrumentul greșit pentru analizarea HTML, XML, JSON sau a oricărei structuri imbricate. Folosește un analizor adecvat pentru acestea.
Sfat Testează și depanează tiparele regex în timp real: Cum să testezi tipare regex. Lipești tiparul și datele de test și vezi imediat potrivirile evidențiate.
Începe să testezi regex-ul chiar acum:
Gratuit, feedback instant și fără înregistrare.