Ce face (?<=...) și (?<!...) (Positive / Negative Lookbehind)
Aserțiunile Lookbehind („privire înapoi”) sunt oglinda exactă a celor lookahead: ele verifică ce se află imediat în stânga (înaintea) poziției curente, fără a include acel prefix în rezultatul potrivit.
Positive Lookbehind (?<=Y)X potrivește X doar dacă este precedat de Y (de exemplu, extragerea prețului după simbolul $ fără a include $ în rezultat: (?<=\$)\d+). Negative Lookbehind (?<!Y)X potrivește X doar dacă în stânga lui nu se află Y.
Variante și sintaxă asociată
| Expresie / Simbol | Descriere |
|---|---|
(?<=Y)X |
Positive Lookbehind: potrivește X doar dacă în stânga lui se află imediat Y. |
(?<!Y)X |
Negative Lookbehind: potrivește X doar dacă în stânga lui NU se află Y. |
(?<=@)[\w.-]+ |
Extrage numele domeniului dintr-un email (tot ce urmează imediat după @). |
\K |
În PCRE (PHP): alternativă flexibilă la lookbehind care „uită” tot ce s-a potrivit la stânga lui \K. |
Exemple
Exemplul 1: Extragerea valorii numerice după un prefix cu (?<=...)
Vrem să extragem doar cifrele care apar după ID: sau după simbolul $.
Expresie: /(?<=\$)\d+(?:\.\d{2})?/g
Text: "Articolul #104 costă $49.99, redus de la $75."
Potriviri găsite (Matches)
Match 1: "49.99"
Match 2: "75"
(104 este ignorat deoarece are # în față, nu $, iar simbolul $ nu este inclus în match)
Exemplul 2: Evitarea caracterelor escapate cu Negative Lookbehind (?<!\\)
Potrivim doar ghilimelele care NU au un backslash chiar în fața lor.
Expresie: /(?<!\\)"/g
Text: 'Text cu \"ghilimele escapate\" și "ghilimele reale".'
Potriviri găsite (Matches)
Potrivește doar cele 2 ghilimele din jurul "ghilimele reale"
(cele precedate de \ sunt ignorate)
Greșeli frecvente
- În PHP (PCRE) și Python (modulul standard
re), șablonul din interiorul unui lookbehind trebuie să aibă lungime fixă! De exemplu,(?<=ab|cd)este permis (ambele au 2 caractere), dar(?<=\d+)sau(?<=a*)aruncă eroarea lookbehind assertion is not fixed length. În PHP, soluția este să folosești\K(ex./\d+\Klei/), iar în JavaScript (ES2018+) și .NET sunt permise și lookbehind-urile cu lungime variabilă. - Inversarea ordinii simbolurilor:
(?<=...)are semnul<înainte de=sau!. De asemenea, lookbehind-ul se scrie în stânga elementului pe care îl cauți ((?<=prefix)cuvant), nu în dreapta.
Simboluri și rețete înrudite
(?=...) și (?!...) (Positive / Negative Lookahead): Verifică dacă poziția curentă este urmată (?=…) sau NU este urmată (?!…) de un anumit șablon, fără a consuma caracterele.\b și \B (limită de cuvânt): Potrivește poziția de graniță dintre un cuvânt și un non-cuvânt (\b) sau o poziție din interiorul cuvântului (\B).\p{L} și diacriticele românești (ăîâșț): Potrivește corect toate literele Unicode și diacriticele românești (ă, î, â, ș, ț) folosind proprietăți Unicode sau clase explicite.(?:...) (grup fără captură): Grupează elementele pentru aplicarea cuantificatorilor sau a operatorului |, fără a salva subșirul în lista de capturi.