Ce face + și * (unu sau mai multe / zero sau mai multe)
Cuantificatorii + și * se aplică întotdeauna elementului (caracter, clasă sau grup) aflat imediat în stânga lor. Semnul plus (+) cere ca elementul precedent să apară de cel puțin o dată (1 sau mai multe ori, echivalent cu {1,}).
Asteriscul (*) este mai permisiv: acceptă zero sau mai multe apariții (echivalent cu {0,}). Asta înseamnă că elementul cuantificat cu * poate lipsi complet fără ca potrivirea să eșueze. Amândoi sunt greedy (lacomi) în mod implicit, încercând să consume cât mai multe caractere posibil.
Variante și sintaxă asociată
| Expresie / Simbol | Descriere |
|---|---|
X+ |
Potrivește X repetat de 1, 2, 3… sau mai multe ori (obligatoriu cel puțin o apariție). |
X* |
Potrivește X repetat de 0, 1, 2… ori (elementul X este complet opțional). |
\d+ |
Un număr format din cel puțin o cifră (nu potrivește șirul vid). |
\s* |
Zero sau mai multe spații opționale (ideal în jurul operatorilor, ex. \s*=\s*). |
(ab)+ |
Grupul „ab” repetat: potrivește „ab”, „abab”, „ababab”. |
Exemple
Exemplul 1: Diferența practică dintre + și * pe un șablon simplu
În go+gle litera o trebuie să apară măcar o dată; în go*gle este permis și ggle.
Expresie 1: /go+gle/g
Expresie 2: /go*gle/g
Text: "ggle, gogle, google, gooooogle"
Potriviri găsite (Matches)
/go+gle/g potrivește: "gogle", "google", "gooooogle" (NU potrivește "ggle")
/go*gle/g potrivește: "ggle", "gogle", "google", "gooooogle"
Exemplul 2: Parsarea perechilor cheie = valoare cu spații opționale (\s*)
Cum în jurul semnului = pot exista zero, unul sau mai multe spații, \s* este alegerea ideală.
Expresie: /(\w+)\s*=\s*(\d+)/g
Text: "port=8080, timeout = 30, max_conn =100"
Potriviri găsite (Matches)
Match 1: "port=8080" (cheie: "port", valoare: "8080")
Match 2: "timeout = 30" (cheie: "timeout", valoare: "30")
Match 3: "max_conn =100" (cheie: "max_conn", valoare: "100")
Greșeli frecvente
- Folosirea unei expresii care conține doar
*(cum ar fi/\d*/g): pentru că*acceptă și zero caractere, motorul RegEx va potrivi șirul vid""înaintea fiecărei litere din text! Pentru a extrage numere, folosește mereu\d+. - Uitarea grupării când vrei să repeți un cuvânt întreg:
ab+repetă doar literab(potrivindabbb), nu silabaab. Pentru a repetaab, folosește paranteze:(ab)+sau(?:ab)+.
Simboluri și rețete înrudite
? (opțional: 0 sau 1): Marchează elementul precedent ca fiind opțional (poate apărea de 0 ori sau cel mult 1 dată).{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).(?:...) (grup fără captură): Grupează elementele pentru aplicarea cuantificatorilor sau a operatorului |, fără a salva subșirul în lista de capturi.