+ și * (unu sau mai multe / zero sau mai multe) în Expresii Regulare (RegEx)

Cuantificatori (repetiții) PCRE / ECMAScript / POSIX

Specifică repetarea elementului precedent de cel puțin o dată (+) sau de zero ori mai multe ori (*).

Tipar RegEx
a+   |   a*   |   d+   |   [a-z]*

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 litera b (potrivind abbb), nu silaba ab. Pentru a repeta ab, folosește paranteze: (ab)+ sau (?:ab)+.

Simboluri și rețete înrudite