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ântulprefixdevine 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
+ și * (unu sau mai multe / zero sau mai multe): Specifică repetarea elementului precedent de cel puțin o dată (+) sau de zero ori mai multe ori (*).{n}, {n,} și {n,m} (număr exact de repetiții): Controlează precis de câte ori trebuie să se repete un caracter sau un grup: exact n, minim n sau între n și m ori.Greedy vs Lazy (*?, +?, ??): Controlează dacă un cuantificator consumă cât mai mult text posibil (greedy) sau cât mai puțin (lazy / non-greedy).\ (escaparea caracterelor speciale): Anulează rolul special al metacaracterelor RegEx (. + * ? ^ $ ( ) [ ] { } | \) pentru a le căuta ca text literal.