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
(...) (grup de captură): Grupează mai multe elemente într-o singură unitate și salvează (capturează) subșirul potrivit pentru extragere sau înlocuire.(?<nume>...) (grup cu nume): Asociază un nume descriptiv unui grup de captură pentru a accesa valoarea extrasă după cheie, nu doar după număr.| (operatorul SAU / alternare): Permite alegerea între două sau mai multe expresii alternative (SAU logic în RegEx).(?=...) și (?!...) (Positive / Negative Lookahead): Verifică dacă poziția curentă este urmată (?=…) sau NU este urmată (?!…) de un anumit șablon, fără a consuma caracterele.