Lookahead & Lookbehind (Aserțiuni de Lungime Zero) în Expresii Regulare (RegEx)

Aserțiuni Avansate PCRE / JavaScript ES2018+ / Python

Potrivirea textului exclusiv dacă este precedat sau urmat de anumite modele, fără a include acele caractere în rezultatul capturat.

Tipar RegEx
(?=...), (?!...), (?<=...), (?<!...)

Î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.

Ghiduri și noțiuni înrudite