(?:…) (grup fără captură) în Expresii Regulare (RegEx)

Grupuri și referințe PCRE / ECMAScript / Python

Grupează elementele pentru aplicarea cuantificatorilor sau a operatorului |, fără a salva subșirul în lista de capturi.

Tipar RegEx
(?:pattern)   |   (?:http|https)://   |   (?:.d+)?

Ce face (?:...) (grup fără captură)

Sintaxa (?:...) (non-capturing group) îți permite să grupezi o secvență de caractere sau o alternare (|) exact ca parantezele normale (...), dar fără a aloca un număr de grup și fără a salva subșirul în array-ul de capturi.

Este o bună practică esențială în expresiile regulare complexe: folosește (?:...) pentru toate grupările pur structurale (prefixe opționale, variante cu |, silabe repetate cu +) și păstrează parantezele simple (...) sau cu nume (?<nume>...) exclusiv pentru datele pe care chiar vrei să le extragi în cod.

Variante și sintaxă asociată

Expresie / Simbol Descriere
(?:...) Grupează subexpresia fără a crea un grup de captură ($1, $2 rămân neafectate).
(?:A|B) Alege între A și B fără a adăuga un element suplimentar în array-ul $matches.
(?:abc)+ Repetă secvența „abc” de una sau mai multe ori fără a o captura separat.
(?i:...) În PCRE (PHP): grup fără captură care activează local flag-ul i (case-insensitive).

Exemple

Exemplul 1: Păstrarea curată a indexului capturilor într-un URL

Folosim (?:https?|ftp) și (?:www\.)? ca grupuri fără captură, astfel încât domeniul să fie direct în $m[1].

// PHP:
$url = "https://www.dexblog.ro/invata/regex/";
preg_match('~^(?:https?|ftp)://(?:www\.)?([^/]+)(/.*)$~', $url, $m);

Potriviri găsite (Matches)

$m[0] => "https://www.dexblog.ro/invata/regex/"
$m[1] => "dexblog.ro"      (Domeniul este direct în grupul 1!)
$m[2] => "/invata/regex/"  (Calea este direct în grupul 2!)

Exemplul 2: Diferența la split() în JavaScript și PHP (PREG_SPLIT_DELIM_CAPTURE)

În JavaScript, str.split(regex) include în rezultat grupurile cu captură (...), dar ignoră (?:...)!

// JavaScript:
"10px, 20em; 30rem".split(/\s*(?:,|;)\s*/);
// Dacă foloseam /(,|;)/ cu captură, virgula și punctul și virgula apăreau în array!

Potriviri găsite (Matches)

["10px", "20em", "30rem"]

Greșeli frecvente

  • Confuzia vizuală între (?:...) (grup fără captură — consumă caractere normal) și (?=...) (positive lookahead — aserțiune de lungime zero care NU consumă caractere).
  • Uitarea celor două puncte (scrierea lui (?...) în loc de (?:...)), ceea ce provoacă eroare de sintaxă în toate motoarele RegEx.

Simboluri și rețete înrudite