? (opțional: 0 sau 1) în Expresii Regulare (RegEx)

Cuantificatori (repetiții) PCRE / ECMAScript / POSIX

Marchează elementul precedent ca fiind opțional (poate apărea de 0 ori sau cel mult 1 dată).

Tipar RegEx
a?   |   https?   |   (?:ro-)?

Ce face ? (opțional: 0 sau 1)

Semnul întrebării (?) plasat după un caracter, o clasă sau un grup indică faptul că acel element este opțional: poate să lipsească (0 apariții) sau să apară o singură dată (1 apariție), fiind echivalent cu {0,1}.

Este foarte util atunci când vrei să accepți două variante apropiate ale unui cuvânt sau format: de exemplu https? potrivește atât http, cât și https, iar colou?r potrivește atât color, cât și colour. Notă: dacă ? este pus după un alt cuantificator (precum *?, +?, ??), el nu mai înseamnă „opțional”, ci transformă cuantificatorul în modul lazy (non-greedy).

Variante și sintaxă asociată

Expresie / Simbol Descriere
X? Elementul X este opțional (apare de 0 sau 1 dată).
https?:// Potrivește atât http:// cât și https:// (litera s este opțională).
-?\d+ Un număr întreg cu semn minus opțional în față (ex. 42 sau -42).
(?:\.\d+)? Grup fără captură opțional pentru partea zecimală a unui număr.
X?? Cuantificator opțional în mod lazy (preferă 0 apariții dacă restul expresiei reușește).

Exemple

Exemplul 1: Potrivirea numerelor de telefon cu sau fără prefixul 0 / +40

Facem opționale atât semnul +, cât și spațiile sau cratimele dintre grupurile de cifre.

Expresie: /(?:\+?40)?0?7\d{2}[- ]?\d{3}[- ]?\d{3}/g
Text:     "Contact: 0722123456, 0722 123 456, +40744-999-888"

Potriviri găsite (Matches)

Match 1: "0722123456"
Match 2: "0722 123 456"
Match 3: "+40744-999-888"

Exemplul 2: Plural opțional sau literă opțională în cuvinte

Putem face opțională o literă sau o terminație întreagă folosind un grup (?:...)?.

Expresie: /\bfactur(?:a|ii|ile)?\b/gi
Text:     "Am emis factura, am verificat facturile și detaliile facturii."

Potriviri găsite (Matches)

Match 1: "factura"
Match 2: "facturile"
Match 3: "facturii"

Greșeli frecvente

  • Scrierea lui prefix? crezând că tot cuvântul prefix devine opțional: în realitate, doar ultima literă (x) este opțională! Pentru a face un șir întreg opțional, înconjoară-l cu paranteze: (?:prefix)?.
  • Uitarea escapării semnului întrebării (\?) atunci când vrei să potrivești query string-ul dintr-un URL (ex. index\.php\?id=\d+).

Simboluri și rețete înrudite