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.

Cuantificatori PCRE

Cuantificatorii sunt operatori de repetiţie precum asterixul * sau plusul +. Operatorii de repetiţie indică faptul că ceea ce este înainte, fie că este un caracter, o clasa sau o supexpresie, se poate repeta. Că se poate repeta o dată sau de ori de câte ori şi aşa mai departe, asta este altă poveste. Un alt cuantificator este şi semnul întrebării ? care spune motorului RegEx să încerce să bifeze caracterul sau supexpresia dinainte niciodată sau o singură dată. Nu prea este mare repetiţie aici, deci vom trece mai departe.

Să luăm două exemple de repetiţie pe cuantificatorul * pentru a înţelege mai bine procesul. Primul este unul simplu şi anume: ab*. Acest şablon se poate mula pe următoarele şiruri de caractere: a, ab, abb şi aşa mai departe. Asterixul înseamnă că acel caracter de dinainte se poate repeta de mai multe ori sau niciodată. Dacă vrem ca o supexpresie să se repete de mai multe ori sau niciodată putem avea un şablon de genul: a(bc)* cu următoarele şiruri de caractere valide găsite: a,abc,abcbc şi aşa mai departe. Deasemenea putem folosi cuantificatorii şi cu clase de caractere dându-ne alte posibilităţi. În loc ca un singur caracter să se repete tot el, de mai multe ori sau niciodată, se poate ca mai multe caractere distincte sau nu să se repete şi ăsta este exemplul al doilea a[a-z]* poate însemna: a,aa,aab, aac, abcd şi aşa mai departe. Orice caracter din clasa de caractere de la a la z se poate repeta de ori de câte ori sau niciodată şi nu trebuie să fie acelaşi caracter. Repetiţia devine acum un fel de a spune căci nu se mai repetă acelaşi caracter şi se repetă un caracter oarecare ori de câte ori este nevoie. Modul în care folosim cuantificatorii şi ajutorul pe care ni-l oferă depinde doar de imaginaţia noastră.

Există şi cuantificatori care limitează numărul de caractere care să se repete. Dacă la asterix * aceştia se pot repeta de oricâte ori sau niciodată, în cazul operatorului {minim,maxim} aceştia se pot repeta de între minim şi maxim de ori. În cazul în care nu se foloseşte un maxim şi se declară doar minimul caracterul sau supexpresia de dinainte se poate repeta de ori de câte ori, asta dacă se repetă.

Trebuie să fim atenţi la faptul că aceşti cuantificatori sunt lacomi. Un cuantificator lacom va încerca să repete şirul de caractere primit de câte ori este posibil. Un cuantificator care nu este lacom va încerca să repete şirul de caractere primit de câteva ori şi apoi să extindă şirul de caractere rezultat folosindu-se de backtrackingul motorului RegEx. Cei lacomi încep cu totul şi apoi mai dau de la ei şi cei care nu sunt lacomi încep cu puţin şi apoi mai iau şi ei ceva. Cam aşa stă şi treaba cu cuantificatorii din spatele motorului RegEx. Să presupunem că vrem să obţinem doar un tag html dintr-un şir de text ca următorul: <b>programator</b>bun. Dacă vom folosi un şablon cu un cuantificator în felul următor <.+> vom avea supriza, dacă suntem la început, să observăm că nu este returnat <b> şi <b>programator</b>. Chiar dacă şablonul pare să se muleze iniţial numai pe <b>, lăcomia cuantificatorului + face să mai străbată prin şirul de text în căutarea unui alt şablon care începe cu < şi se termină cu > şi are probabil o lungime mai mare. Cum acesta este găsit şi altele nu mai există, este returnat. Acest lucru se întâmplă deoarece cuantificatorul întâi repetă până la maxim toate caracterele din şirul de text pe care-l primeşte apoi se întoarce. După aceea backtrackingul îşi face meseria aşa cum ştie mai bine.

Ca să scăpăm de această aşa zisă problemă şi putem să folosim cuantificatorii care nu sunt lacomi şi au un semnul întrebării în faţă. Cu ce ne pot ajuta aceştia în cazul de faţă şi anume exemplul de mai sus: <b>programator</b>bun. Cum menţionasem aş vrea să obţin doar primul tag bold şi nu şi cuvântul programator între tagurile bold aşa cum am obţinut cu lăcomia cuantificatorilor. Să considerăm următorul şablon: <.+?> care foloseşte cuantificatori care nu sunt lacomi, indicat acest lucru de semnul întrebării. Acesta va returna doar <b>. Ca să înţelegem pe deplin de ce se întâmplă şi cum se întâmplă acest lucru vom urmări îndeaproape cum funcţionează motorul RegEx pe acest şablon. Ştim că + trebuie să identifice minimum un caracter şi maximum oricâte caractere. Prima dată se găseşte în <b> < -ul apoi b, deci se găseşte minimul cerut şi se iese din repetiţia cuantificatorului. Apoi se găseşte şi > -ul de închidere. Cuantificatorii care nu sunt lacomi îşi fac treaba bine în acest caz. În cazul în care respectivul tag html ar fi fost <strong> spre exemplu şi textul ar fi fost <strong>programator</strong> tot <strong> s-ar fi obţinut. În momentul în care s-a îndeplinit minimul cerut, deci caracterul s şi s-a ieşit din repetiţie se verifică >. După aceea se reintră în repetiţie şi se verifică t-ul şi aşa mai departe.

Înafară e cuantificatorii lacomi şi cei care nu sunt lacomi mai există şi cuantificatorii posesivi. Aceştia au şi ei un rol important şi anume de a reduce timpul petrecut de motorul RegEx prin şirul de caractere şi a ajunge mai repede la un rezultat valid. Ca rezultatul să fie valid şi din punctul nostru de vedere, ceea ce ne dorim de la rezultat, trebuie să fim atenţi ce tip de cuantificatori folosim.

Există şi secvenţe de scăpare care indică anumiţi cuantificatori ca şi caractere literare nu cu sensul de cuantificatori. Acestea ne-ar putea ajuta în momentul în care şirul de caractere căutat conţine şi caractere care la modul literar sunt la fel ca şi cuantificatorii folosiţi pentru a căuta acele caractere. Modul în care folosim cuantificatorii şi la ce îi folosim, dar şi ce tipuri de cuantificatori folosim nu poate fi ştiut decât de noi. Nu putem spune că un cuantificator e mai bun sau mai optim decât celălalt decât într-un anumit context de căutare. Dacă noi chiar avem nevoie să căutăm, pas cu pas, printr-un şir de caractere gigant, asta este. Dacă avem nevoie să căutăm prin acelaşi şir de caractere gigant dar s-ar putea să nu fie nevoie să-l traversăm pe tot pentru a găsi ceea ce căutăm, asta este un alt context decât primul.