În parsarea textelor complexe, apare des necesitatea de a extrage o valoare doar dacă respectă un anumit context, fără ca acel context să facă parte din potrivirea efectivă (de exemplu: extragerea sumei dintr-un text ca ‘150 EUR’ dorind doar ‘150’, dar exclusiv dacă este urmat de ‘EUR’).
Mecanismele de Lookaround (Aserțiuni de lungime zero) inspectează caracterele înainte sau după poziția curentă fără a consuma caractere din șir.
Există patru tipuri fundamentale: Positive Lookahead `(?=…)` (urmat de), Negative Lookahead `(?!…)` (care NU este urmat de), Positive Lookbehind `(?<=…)` (precedat de), și Negative Lookbehind `(?<!…)` (care NU este precedat de).
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
(?=abc) |
Positive Lookahead: validează dacă urmează caracterele ‘abc’. |
(?!abc) |
Negative Lookahead: validează dacă NU urmează caracterele ‘abc’. |
(?<=abc) |
Positive Lookbehind: validează dacă înaintea poziției curente se află 'abc'. |
(? |
Negative Lookbehind: validează dacă înaintea poziției curente NU se află 'abc'. |
Zero-Width Assertion |
Proprietatea de a nu avansa cursorul de potrivire în textul parcurs. |
Exemple practice și cod
Exemplul 1: Extragerea sumelor numerice doar dacă sunt exprimate în RON folosind lookaround
Cum se extrage valoarea curată fără sufixul valutei.
Text de intrare:
"Factura #101 are valoarea de 450 RON, iar comisionul bancar este de 15 EUR."
Expresie Regulată cu Positive Lookahead:
\b\d+(?=\s+RON\b)
• \b\d+ -> Potrivește cifrele numerice
• (?=\s+RON) -> Validează că după cifre urmează spațiu și cuvântul 'RON'
Rezultat extras curat: "450"
(Valoarea "15" este ignorată automat deoarece este urmată de EUR, nu de RON!)
Rezultat & Impact
Extragere precisă a valorii numerice fără a include cuvântul 'RON' în match.
Greșeli frecvente și bune practici
- Utilizarea de cuantificatori cu lungime variabilă nelimitată (cum ar fi `(?<=.*)`) în motoare vechi de RegEx care suportă exclusiv Lookbehind cu lungime fixă.
- Confundarea Lookahead-ului `(?=...)` cu un grup de captură obișnuit `(...)`, ceea ce duce la rezultate neașteptate la înlocuiri de text.