MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Obiectul RegExp - Expresii regulate

Expresiile regulate reprezintă șabloane utilizate pentru căutare sau modificare a șirului de caractere. Desigur, pentru manipularea șirurilor putem utiliza un set standard de metode de tip String. Cu toate acestea, expresiile regulate oferă un instrument mai flexibil.

Pentru a lucra cu expresii regulate în JavaScript, este definit obiectul RegExp.

Există două moduri de a defini o expresie regulată:

const myExp1 = /hello/;
const myExp2 = new RegExp("hello");

Utilizată aici, expresia regulată este destul de simplă: constă dintr-un singur cuvânt "hello". În primul caz, expresia este plasată între două bare oblice (numită notație literală), iar în al doilea caz, este utilizat constructorul RegExp, în care expresia este transmisă sub formă de șir de caractere.

În general, atunci când expresia regulată este definită dinamic (de exemplu, prin intermediul input-ului utilizatorului), este recomandat să se folosească constructorul. Dacă expresia este statică și neschimbată, atunci notația literală este preferată, așa cum este prezentat în primul caz.

După ce am definit expresia regulată pentru manipularea șirurilor, putem utiliza una dintre metodele RegExp:

  • test(): verifică dacă un anumit șablon este prezent într-un șir. Dacă șirul corespunde șablonului, această metodă returnează true; altfel, returnează false
  • exec(): caută aparițiile unui anumit șablon într-un șir și returnează aceste apariții sub formă de array

De asemenea, pentru manipularea expresiilor regulate, putem utiliza și câteva metode de tip String:

  • match(): caută aparițiile unui anumit șablon într-un șir și returnează aceste apariții sub formă de array
  • replace(): înlocuiește aparițiile unui anumit șablon într-un șir
  • search(): caută aparițiile unui anumit șablon într-un șir și returnează indexul primei apariții
  • split(): împarte un șir în funcție de un anumit șablon și returnează părțile rezultate sub formă de array

Metoda test() este utilizată pentru a verifica dacă un șir conține un text care se potrivește cu o expresie regulată. Această metodă returnează true dacă șirul conține text care se potrivește cu expresia regulată, iar false dacă nu conține.

const initialText = "hello world!";     // șirul în care căutăm
const exp = /hello/;    // expresia regulată
const result = exp.test(initialText);   // verificăm dacă șirul conține expresia exp
console.log(result); // true
 
const initialText2 = "Hi all";
const result2 = exp.test(initialText2);
console.log(result2); // false - în șirul "Hi all" nu există "hello"

În acest caz, verificăm dacă șirurile `initialText` ("hello world!") și `initialText2` ("Hi all") conțin expresia exp (/hello/). Deoarece primul șir conține această expresie, exp.test(initialText) returnează true. În cazul celui de-al doilea șir, această expresie nu există, astfel că se returnează false.

Metoda exec()

Metoda exec() funcționează similar cu test, deoarece și ea verifică dacă un șir conține text care se potrivește cu o expresie regulată. În cazul în care textul potrivit este găsit, metoda returnează partea șirului care corespunde expresiei. Dacă nu există nicio potrivire, metoda returnează valoarea null.

const initialText = "hello world!";     // șirul în care căutăm
const exp = /hello/;    // expresia regulată
const result = exp.exec(initialText);   // verificăm dacă șirul conține expresia exp
console.log(result); // ['hello', index: 0, input: 'hello world!', groups: undefined]
 
const initialText2 = "Hi all";
const result2 = exp.exec(initialText2);
console.log(result2); // null - în șirul "Hi all" nu există "hello"

Astfel, în șirul "hello world!" există text care corespunde șablonului /hello/, așa că apelul metodei exp.exec(initialText) va returna apariția textului care se potrivește expresiei în șir. După cum se poate vedea în afișajul consolei, nu este returnat doar textul potrivit, ci și un array de valori:

['hello', index: 0, input: 'hello world!', groups: undefined]

Primul element al array-ului este textul care se potrivește expresiei (în acest caz, "hello"). Al doilea element este indexul acestui text în șir (în acest caz, indexul 0 - începutul șirului). Al treilea element reprezintă șirul de intrare. Al patrulea element reprezintă grupul, care în exemplul de mai sus este nedefinit (grupele vor fi discutate ulterior).

Grupuri de caractere

În exemplele anterioare, am folosit șirul "hello" ca expresie regulată. În realitate, pentru a verifica prezența acestui subșir într-un șir, am putea folosi și metode standard de tip String. Cu toate acestea, expresia nu este doar un șir, ci un șablon care poate include, de asemenea, elemente speciale de sintaxă pentru expresii regulate. Să examinăm câteva șabloane de bază:

  • . (punct) se potrivește oricărui caracter
  • a (un singur caracter) se potrivește caracterului "a"
  • ab (concatenare de caractere) se potrivește secvenței de caractere "ab"
  • a|b se potrivește fie caracterului "a", fie caracterului "b" (simbolul | poate fi văzut ca o analogie a operației OR)

De exemplu, să presupunem că trebuie să verificăm lungimea unei parole - să fie cel puțin de 8 caractere:

const exp = /......../;    // expresia regulată - 8 caractere

const password1 = "1234567890";
const password2 = "qwery5";
// verificăm prima parolă
console.log(exp.test(password1));   // true -  password1 se potrivește expresiei exp
// verificăm a doua parolă
console.log(exp.test(password2));   // false -  password2 nu se potrivește expresiei exp

Aici, expresia regulată "/......../" are 8 puncte. Prin urmare, pentru a se potrivi acestei expresii, șirul trebuie să aibă cel puțin 8 caractere.

Un alt exemplu:

const exp = /word|work/;    // se potrivește fie "word", fie "work"

const str1 = "hello world";
const str2 = "hello work";
const str3 = "hello word";
console.log(exp.test(str1));   // false
console.log(exp.test(str2));   // true
console.log(exp.test(str3));   // true

Aici, expresia "/word|work/" se potrivește textului care conține fie "word", fie "work". Cu toate acestea, această expresie nu este optimă - în ambele variante, grupa de caractere "wor" este repetată. Putem să luăm grupul comun de caractere și să-l punem între paranteze: "/(wor)d|k/". Rezultatul va fi același:


const exp = /(wor)d|k/;    // se potrivește fie "word", fie "work"

const str1 = "hello world";
const str2 = "hello work";
const str3 = "hello word";
console.log(exp.test(str1));   // false
console.log(exp.test(str2));   // true
console.log(exp.test(str3));   // true

Un alt exemplu - să verificăm dacă o adresă de e-mail aparține domeniilor "yandex.com" sau "gmail.com":


const exp = /@yandex|@gmail(.com)/;    // se potrivește fie "@yandex.ru" fie "@mail.ru"

const email1 = "tom@gmail.com";
const email2 = "tom@mail.com";
const email3 = "tom@yandex.com";
console.log(exp.test(email1));   // true
console.log(exp.test(email2));   // false
console.log(exp.test(email3));   // true
← Lecția anterioară Lecția următoare →