Subșabloane Condiționale în RegEx ((?(condition)yes|no)) în Expresii Regulare (RegEx)

Aserțiuni Avansate PCRE / Python / Perl

Ghid complet pentru instrucțiuni logice IF-THEN-ELSE în expresii regulate: validarea parantezelor pereche și adaptarea dinamică a șablonului pe baza grupurilor capturate anterior.

Tipar RegEx
^(\()?\d{3}(?(1)\)|-)\d{7}$

În multe cazuri de validare din lumea reală, prezența unui caracter impune obligativitatea altui caracter mai târziu în șir. De exemplu, un număr de telefon poate fi scris fie cu prefixul între paranteze (0722)123456, fie fără paranteze 0722-123456, dar nu cu o singură paranteză deschisă (0722-123456. Subșabloanele Condiționale permit scrierea de logică decizională direct în RegEx.

Sintaxa generală IF-THEN-ELSE în RegEx
(?(condiție)șablon-dacă-adevărat|șablon-dacă-fals)
// Condiția poate fi:
// 1. Un număr de grup de captură: (?(1)...) -> Verifică dacă grupul 1 a participat la potrivire!
// 2. Un nume de grup: (?()...)
// 3. O aserțiune lookaround: (?(?=[a-z])...)
Validarea parantezelor pereche pentru prefixe telefonice
^ (\()? \d{4} (?(1)\)|-) \d{6} $

// Cum se evaluează:
// 1. (\()? -> Grupul 1 capturează opțional paranteza deschisă '('.
// 2. \d{4} -> Urmează 4 cifre de prefix (ex: 0722).
// 3. (?(1)\)|-) -> CONDIȚIA:
//    - DACĂ grupul 1 a fost capturat (adică a existat '(' la început):
//      ATUNCI trebuie să urmeze obligatoriu paranteza închisă ')'!
//    - ALTFEL (nu a existat paranteză la început):
//      ATUNCI trebuie să urmeze o cratimă '-'!
// 4. \d{6} -> Urmează restul de 6 cifre.

// Rezultate:
// "(0722)123456" -> VALID!
// "0722-123456"  -> VALID!
// "(0722-123456" -> RESPINS AUTOMAT! (lipsește paranteza pereche)

Condiție Bazată pe Lookaround

Dacă nu doriți să folosiți un grup de captură, condiția poate fi o verificare directă prin lookaround:

^(?(?=[A-Z])\w{10}|\d{5})$
# Dacă primul caracter este o majusculă, textul trebuie să fie un cod alfanumeric de 10 caractere;
# Altfel, trebuie să fie un cod numeric de 5 cifre!