(?<=...) și (? în Expresii Regulare (RegEx)

Lookaround și flag-uri PCRE / ECMAScript (ES2018+) / Python

Verifică dacă poziția curentă este precedată (?<=...) sau NU este precedată (?<!...) de un șablon, fără a-l include în match.

Tipar RegEx
(?<=Y)X   |   (?<!Y)X

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