Expresii regulate  


Cãutare


Siteuri recomandate

  • ABC Domenii Pachete de gazduire pentru siteuri personale si bloguri.
  • AutoIt Script Curs AutoIt in limba romana.
  • CHML Web Services Servere dedicate si servere virtuale private.
  • Hostvision Gazduire siteuri web si inregistrare domenii
  • IPFind.eu IPFind.eu – Free IP address finder and DNS troubleshooter
  • LAMP Platforma open source de gazduire a site-urilor web.
  • NetHelp Intrebari tehnice si raspunsuri de calitate pentru intrebari tehnice.
  • SkullBox Comunitate online pentru pasionatii de IT.
  • WordPress Admin Tutoriale de utilizare si administrare a blogurilor WordPress.

Grupuri atomice, cuantificatori posesivi

Grupul atomic este acela, atunci când motorul RegEx îşi termină şi îl părăseşte, automat el aruncă la o parte toate poziţiile din backtrack reţinute. Mai pe scurt, odată ce a găsit o rezolvare validă el motorul RegEx, care ar trebui să ţină cont că ar mai putea fi şi alte rezolvări, părăseşte grupul atomic. Sintaxa pentru un grup atomic este următoarea: (?>grup). De reţinut că grupurile atomice sunt suportate în majoritatea motoarelor RegEx şi anume: Java, PCRE, . NET, Perl sau Ruby. Unele dintre ele suportă şi cuantificatori posesivi pe care îi vom aminti un pic mai târziu.

Ca să înţelegem mai bine grupurile atomice şi cum acestea funcţionează defapt cel mai sănătos este un exemplu. Să considerăm un şablon alternativ de genul x(ab|a)b. Ştim că un astfel de şablon alternativ se mulează pe unul dintre celor două şiruri de text şi anume „xabb” sau „xab„. Am scris sau deoarece odată ce una dintre variante este găsită în stringul de text căutat toată treaba se întrerupe. În cazul grupurilor atomice, exemplul de mai sus se va mula decât pe un singur string în orice caz şi anume xabb. Bineînţeles, pentru ca asta să se întâmple şablonul va arăta în felul următor x(?>ab|a)b. Totuşi, poate părea ciudat, având un şablon alternativ ca unul dintre răspunsuri să nu se muleze niciodată. Atunci care ar mai fi scopul unui şablon alternativ? Ca să înţelegem scopul grupurilor atomice şi rezultatul şablonului de mai sus trebuie în primul rând să ştim cum funcţionează în acest caz motorul RegEx, motor despre care discutam la început. Să reluăm exemplu de mai sus pas cu pas în cazul în care este un grup atomic. Să considerăm şirul de caractere „xab„, care, în cazul în care nu este grup atomic ar fi un răspuns valid. Motorul RegEx intră şi verifică x cu x, găseşte şi trece mai departe. După aceea verifică primul şir de caractere din şablon, şablon care este într-un grup atomic, le găseşte şi trece mai departe înafara alternării. Cum el nu mai îl găseşte şi pe b, fiind grup atomic şi găsind o soluţie validă în interiorul alternării, părăseşte RegExul şi nu se mulează pe şirul de caractere „xab„. Cu toate că, dacă grupul nu ar fi fost atomic, motorul RegEx nu s-ar fi oprit aici şi ar fi reţinut că mai are nişte valori de încercat în şablonul de alternare. Cam asta e treaba cu grupurile atomice, în mare.

Modul în care folosiţi grupurile atomice şi puterea pe care acestea pot sau nu să o aibă depinde doar de voi. Exemplul de mai sus este unul minimal însă oricare dintre voi se poate juca într-un mod util cu grupurile atomice dacă doreşte ca acestea să-l ajute într-un viitor proiect. Spre exemplu atunci când avem un şablon de alternare cu foarte multe variante şi nu vrem să le încerce pe toate, dacă se poate, putem folosi grupuri atomice înauntrul şabloanelor de alternare. Însă dacă grupurile atomice nu ne ajută şi dau răspunsuri greşite, mai bine nu le folosim în această situaţie. Este de reţinut că atunci când avem un şablon de alternare, pe măsură ce se verifică fiecare variantă în parte şi restul de date din afara alternării, backtrakingul folosit de motorul RegEx are enorm de multe şiruri de text de reţinut. Cu cât mai multe şiruri de text de reţinut şi cu cât mai multe încercări de făcut, cu atât mai mult timp de executat.

Acum să revenim la cuantificatori posesivi despre care începusem discuţia la început. Ca şi în cazul grupurilor atomice şi cuantificatorii posesivi au rolul de a micşora pe cât se poate numărul de încercări făcute de motorul RegEx. Teoretic nu poate decât să fie un lucru bun căci cu cât numărul de încercări din backtrackingul intern al motorului RegEx este mai mic, cu atât timpul de execuţie este şi el mai mic. Un cuantificator este un operator de repetiţie şi anume * sau +. Amândoi indică faptul că tot şirul de text care este înainte se poate repeta. Ca să indicăm că un cuantificator este posesiv trebuie să îi adăugăm un plus + în faţă în felul următor: ++, ?+. Pentru a înţelege mai bine cu ce ne ajută un cuantificator posesiv şi cum el poate influienţa numărul de iteraţii făcute, să luăm următorul exemplu: fie şirul de caractere programator şi şablonul p[^b]*+r Dacă îl analizăm ne dăm seama că şirul de caractere programator se mulează pe şablon căci * ne spune că oricare caracter care nu este b poate să apară de ori de câte ori înainte de r. În cazul în care r-ul din şablon este eliminat, în cazul în care cuantificatorul nu este posesiv, acesta, odată cu insuccesul va încerca să caute şi alte variante de răspuns valabile cum ar fi numai „programato” (care este valabil, desigur, dar nu în cazul cuantificatorilor posesivi). Să presupunem că noi avem nevoie neapărat de textul „programator”, iar în cazul în care acesta nu este găsit nu are sens să mai facem iteraţii în plus chiar dacă se mai găseşte prin textul iniţial un fragment. În acest caz folosirea cuantificatorilor posesivi scuteşte motorul RegEx de backtracking, nu neapărat inutil, cât nedorit de noi.

Faptul că aceşti cuantificatori posesivi ne ajută ca expresia regulată să fie verificată mai repede se bazează pe faptul că această şi pică mult mai repede. După prima dată când nu se găseşte ceea ce se caută totul este lăsat baltă şi se consideră că nu s-a găsit nimic. Trebuie ştiu şi faptul că aceşti cuantificatori posesivi nu sunt altceva decât singularul de la grupurile atomice. Adică cuantificatorii posesivi sunt o metodă convenţională de a pune grupuri atomice lângă un singur cuantificator. Deasemenea trebuie reţinut că motoarele RegEx care suportă cuantificatorii posesivi suportă şi grupurile atomice însă nu toate motoarele RegEx care suportă grupurile atomice suportă şi cuantificatorii posesivi. Deci, pentru a nu întâmpina şi alte erori, atunci când se poate şi obţii exact aceleaşi rezultate poţi folosi grupurile atomice în loc de cuantificatorii posesivi. Oricum, alegerea îţi aparţine în funcţie de ceea ce vrei să obţii.