Aserțiunile Lookaround (Lookahead și Lookbehind) sunt adesea numite „super-puterea secretă” a expresiilor regulate. Ele testează condiții booleene asupra textului adiacent poziției curente a cursorului fără a consuma caractere. După ce un lookaround s-a potrivit cu succes, cursorul de citire al motorului rămâne exact în aceeași poziție ca înainte de test!
^ (?=.*[a-z]) (?=.*[A-Z]) (?=.*\d) (?=.*[@$!%*?&]) [A-Za-z\d@$!%*?&]{8,32} $
// Cum funcționează combinarea de Positive Lookaheads la începutul șirului (^):
// 1. ^ -> Cursorul se află la începutul textului.
// 2. (?=.*[a-z]) -> Verifică dacă există cel puțin o literă mică. Cursorul rămâne la start!
// 3. (?=.*[A-Z]) -> Verifică dacă există cel puțin o literă mare. Cursorul rămâne la start!
// 4. (?=.*\d) -> Verifică dacă există cel puțin o cifră. Cursorul rămâne la start!
// 5. (?=.*[@$!%*?&]) -> Verifică dacă există cel puțin un caracter special.
// 6. [A-Za-z\d@$!%*?&]{8,32} -> CONSUMĂ efectiv textul și verifică lungimea între 8 și 32 caractere!
Lookbehind cu Lungime Fixă vs. Variabilă
Istoric, motoarele de expresii regulate impuneau ca șablonul din interiorul unui Lookbehind ((?<=...)) să aibă o lungime fixă și cunoscută la compilare (de exemplu (?<=https) sau (?<=abc), dar nu (?<=\d+)). În prezent:
- JavaScript V8 (Chrome, Node.js): Suportă lookbehind cu lungime variabilă începând cu ES2018 (inclusiv cuantificatori
+și*). - PCRE2 (PHP 7.4+): Suportă lungime variabilă dacă există o limită maximă definită.
- Python (modulul re): Impune în continuare lungime fixă; pentru lungime variabilă în Python se folosește biblioteca
regex.
// Găsește orice sumă precedată de "RON " sau "EUR ":
(?<=RON\s|EUR\s)\d+(?:\.\d{2})?
// Text: "Factura este de RON 450.00 achitată ieri."
// Rezultat extras: "450.00" (prefixul 'RON ' nu este inclus în rezultat!)