Cuantificatorii în expresiile regulate
În afară de clasele speciale de caractere discutate în articolele anterioare despre expresii regulate, există și o altă categorie de combinații cunoscute sub numele de cuantificatori:
- *: se potrivește cu orice număr de repetări sau absența secvenței de caractere.
- ?: se potrivește cu o apariție a secvenței de caractere sau absența ei în șir. De exemplu, /h?ome/ se potrivește cu subșirurile "home" și "ome".
- +: se potrivește cu una sau mai multe repetări ale secvenței de caractere.
- {n}: se potrivește cu exact n repetări ale caracterului anterior. De exemplu, h{3} se potrivește cu subșirul "hhh".
- {n,}: se potrivește cu n sau mai multe repetări ale caracterului anterior. De exemplu, h{3,} se potrivește cu subșirurile "hhh", "hhhh", "hhhhh", etc.
- {n,m}: se potrivește cu între n și m repetări ale caracterului anterior. De exemplu, h{2,4} se potrivește cu subșirurile "hh", "hhh", "hhhh".
Caracterele opționale:
Un număr de telefon poate să aibă sau să nu aibă cratime pentru separarea blocurilor individuale de cifre, de exemplu, "+1-234-567-8901", sau să nu aibă delimitatori, de exemplu, "12345678901". Cu alte cuvinte, cratimele delimitatoare sunt opționale.
const exp = /\d-?\d\d\d-?\d\d\d-?\d\d\d\d/;
const phone1 = "+1-234-567-8901";
const phone2 = "12345678901";
const phone3 = "1-2345678901";
console.log(exp.test(phone1)); // true
console.log(exp.test(phone2)); // true
console.log(exp.test(phone3)); // true
Aici, "-?" indică faptul că simbolul "-" poate fi opțional, însă dacă este prezent, atunci doar o singură dată.
Număr arbitrar de caractere
Simbolul "*" indică faptul că simbolul anterior poate apărea de un număr arbitrar de ori (inclusiv de 0 ori). De exemplu:
const exp = /;*/; // se potrivește cu orice număr de caractere ;
const str1 = "number1 = 3";
const str2 = "number2 = 4;";
const str3 = "number3 = 5;;;";
console.log(exp.test(str1)); // true
console.log(exp.test(str2)); // true
console.log(exp.test(str3)); // true
Expresia regulată /;*/ indică faptul că punctul și virgulă (;) poate apărea de la 1 dată în sus sau deloc.
Simbolul apare cel puțin o dată
Cuantificatorul + indică faptul că simbolul precedent poate apărea o dată sau de mai multe ori. De exemplu:
const exp = /;+/; // se potrivește cu 1 sau mai multe semne ;
const str1 = "number1 = 3";
const str2 = "number2 = 4;";
const str3 = "number3 = 5;;;";
console.log(exp.test(str1)); // false
console.log(exp.test(str2)); // true
console.log(exp.test(str3)); // true
Expresia regulată /;+/ indică faptul că punctul și virgulă (;) poate apărea cel puțin o dată (sau de mai multe ori).
Număr exact de apariții
Cuantificatorul {n} permite definirea unui număr exact de repetări ale simbolului precedent, prin valoarea n. De exemplu, pentru a defini un număr de telefon, se poate utiliza expresia /\d\d\d\d\d\d\d\d\d\d\d/ - 11 cifre consecutive.
Cu toate acestea, aceasta nu este optimă. Pentru a o scurta, putem utiliza o altă expresie: /\d{11}/ - simbolul "\d" (cifra) apare de 11 ori consecutiv. De exemplu:
const exp = /\d{11}/;
const phone1 = "+12345678901";
const phone2 = "1-2345678901";
const phone3 = "12345678901";
console.log(exp.test(phone1)); // true
console.log(exp.test(phone2)); // false
console.log(exp.test(phone3)); // true
Dar dacă blocurile de cifre sunt separate de un separator sub formă de cratimă, cum ar fi "+1-234-567-8901"? În acest caz, am putea specifica lungimea pentru fiecare bloc: /\d-\d{3}-\d{3}-\d{4}/. De exemplu:
const exp = /\d-\d{3}-\d{3}-\d{4}/;
const phone1 = "+12345678901";
const phone2 = "1-234-567-8901";
const phone3 = "12345678901";
console.log(exp.test(phone1)); // false
console.log(exp.test(phone2)); // true
console.log(exp.test(phone3)); // false
Combinându-le cu alți cuantificatori, putem face separatoarele sub formă de cratimă opționale:
const exp = /\d-?\d{3}-?\d{3}-?\d{4}/;
const phone1 = "+12345678901";
const phone2 = "1-234-567-8901";
const phone3 = "1-2345678901";
console.log(exp.test(phone1)); // true
console.log(exp.test(phone2)); // true
console.log(exp.test(phone3)); // true
Metasimbolul "\w" se potrivește oricărui caracter alfanumeric sau caracterului de subliniere. Prin urmare, expresia regulată /\w{8,}/ se potrivește șirurilor în care există o subșir de cel puțin 8 astfel de caractere.
Definirea unui număr minim și maxim de apariții
Cuantificatorul {n,m} permite definirea simultană a numărului minim (n) și maxim (m) de repetări. De exemplu, dorim ca numele noastre să nu fie prea scurte, să zicem, cel puțin 3 caractere, și nici prea lungi (de exemplu, nu mai mult de 10 caractere):
const exp = /^[a-zA-Z]{3,10}$/;
const code1 = "Tom";
const code2 = "Li";
const code3 = "Maximilianus";
console.log(exp.test(code1)); // true
console.log(exp.test(code2)); // false
console.log(exp.test(code3)); // false
Expresia regulată /^[a-zA-Z]{3,10}$/ indică faptul că orice caracter din intervalele "a-z" și "A-Z" trebuie să se repete de cel puțin 3 ori și nu mai mult de 10 ori. De asemenea, se specifică că aceasta trebuie să fie o întreagă cuvânt. Pentru aceasta, la început este indicat simbolul "^", iar la sfârșit simbolul "$".