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.

Modificatori PCRE

Majoritatea expresiilor regulate suportă modificatori. Modificatorii permit schimbarea parametrilor sub care se deşfăşoară căutarea în stringul de caractere sau în fişiere. Modificatorii oferă o mână de ajutor programatorilor oferindu-le câteva opţiuni interesante precum(case-sensitive/case-insensitive set, single-line mode, multi-line mode, free-spacing mode sau modul fără lăcomie implicită al operatorilor). Modificatorii sunt cei ce urmează mai jos:

/i face motorul RegEx insensitive. Adică nu va ţine cont dacă sunt litere mari sau litere mici căci tot va returna acelaşi rezultat valid. Spre exemplu avem şablonul: a(Ab|C)b care va returna valid şi pentru aAbb, acb şi aşa mai departe. Deci în acest caz aAbb este acelaşi cu aaBB. Trebuie să fim atenţi atunci când activăm acest parametru şi pe ce porţiuni îl activăm, dacă îl activăm pe porţiuni căci s-ar putea vizual să nu observăm că răspunsul chiar este unul valid şi nu eronat cum pare la început. Spre exemplu şablonul x(Cz|a)G o să returneze chiar şi următoarele şiruri de caractere: Xg, XcZG şi aşa mai departe.

/s porneşte modul pe o singură line sau „single-line mode„. În acest caz punctul indică şi spre \n. Faptul că punctul nu indică implicit către începuturi de linie şi anume \n este din motive istorice. La început motoarele RegEx erau folosite în modul text, pe o singură linie şi era normal ca la sfârşit de linie să nu se găsească niciodată indicele newline pentru linia următoare. Nu exista o linie următoare. Pe parcurs, odată ce lucrurile au evoluat şi odată cu acestea şi motoarele regex, a apărut posibilitatea de căutare pe mai multe rânduri deci şi indicele newline. Ca o întoarcele înapoi acum putem să reapelăm opţiunea single-lin mode pentru căutări pe o singură linie, spre exemplu.

/m porneşte modul pe mai multe linii sau „multi-line mode„. Desigur, în acest mod punctul nu indentifică newline-urile şi dacă am vrea să o facă ar trebui să indicăm către modul single-line mode cu expresia /s. În modul multi-line-mode ^ şi $ trebuie să identifice înainte şi după un indice de linie nouă şi anume \n. Acest mod este modul implicit pe care este setat PCRE, de exemplu. Acelaşi lucru se întâmplă şi la motorul RegEx de la Perl. Dacă nu sunt caractere \n sau & şi $ în şirul vizat această opţiune nu are niciun efect atât la PCRE cât şi la Perl.

/x indică modul „free-spacing mode” sau liber la spaţii. În acest mod spaţiile libere sunt ignorate şi # care nu sunt scapate indică un comentariu. Trebuie să fim atenţi odată activată această opţiune să nu ne dea bătăi e cap. În cazul în care expresia regulată pe care ai scris-o este destul de complicată poţi include comentarii pentru a fi mai uşor de înţeles de alţi programatori sau chiar de tine după o perioadă de timp.

/U acest modificator inversează lăcomia cuantificatorilor ca să nu mai fie lacomi implicit. În cazul în care e urmat de ? devine lacom. Acesta nu este compatibil cu motorul RegEx de la Perl. Trebuie menţionam că lăcomia provine din faptul că unii operatori precum * sau + nu se opresc la primul şir de caractere valid dintr-o repetiţie ci încearcă şi celelalte şiruri de caractere, prin intermediul backtrackingului, poate, poate o mai fi vreunul valid. În cazul în care se găsesc mai multe şiruri de caractere valide doar ultimul dintre ele este returnat căci el este cel mai optim dintre şirurile de caractere prezente pentru alegere.

Mai sunt şi alţi câţiva modificatori însă cei prezentaţi mai sus sunt cei mai importanţi cu aplicaţii practice vizibile.

Există şi limbaje care nu suportă aceste opţiuni în RegEx cum ar fi JavaScript şi Ruby. Desigur că fiecare limbaj poate avea implementat pe lângă opţiunile de bază şi altele.

Putem să indicăm o modificare pe toată expresia regulată sau pe anumite părţi din expresia regulată. Motoarele RegEx moderne ar trebui să permită aplicarea de modificări şi pe porţiuni din expresia regulată. Toata treaba a depins de cerere şi oferta de pe piaţă şi nevoile programatorilor. Aşa cum la început totul stătatea în modul text şi nici că exista newline aşa acum se pot face foarte multe lucruri interesante cu expresiile regulate şi cu modificatorii. Dacă inserăm un modificator în expresie acesta se va aplica tuturor caracterelor acesteia de după modificator. Există posibilitatea ca la un moment dat, după un anumit caracter să oprim modificarea. Spre exemplu vrem ca unele caractere să fie case-sensitive şi altele nu.

Câteva aplicaţii practice ale acestor modificatori ar putea fi următoarele: să presupunem că vrem să scriem un cod minimal al unui motor de căutare în fişiere, după un anume algoritm propiu, şi vrem să nu conteze dacă textul găsit este case-senzitive sau nu. Aici putem să folosim modificatorul /i. Spre exemplu să presupunem că un utilizator a creat un conţinut de genul:”Test teSt”, iar un alt utilizator, folosind motorul de căutare respectiv caută şirul de caractere „test test”. În acest caz, dacă nu folosim modificatorul pentru case insenzitive o să observăm că nu vom găsi că cele două rezultate sunt identice deşi poate că, în contextul căutării şi primului conţinut scris de primul user, acestea două chiar sunt identice. În acest caz modificatorii sunt o soluţie eficientă pentru a rezolva o problemă ciudată care ar putea apărea. O altă aplicaţie practică pentru modificatori ar fi transformarea în hexazecimal a unui cod ASCII, de exemplu. În cazul în care unii algoritmi de transformare lasă câte un spaţiu sau două între 4 hexa şi vrem îi ignormă putem să folosim /x ca modificator pentru a elimina această problemă dintr-o posibilă căutare. În cazul în care vrem să adăugăm comentarii putem să folosim cu încredere #. Aplicaţiile sunt nenumărate şi depind doar de imaginaţia sau nevoile unui anumit programator la un moment dat. Astea sunt doar două aplicaţii practice care mi-au trecut prin minte în acest moment.

În concluzie modificatorii sunt nişte opţiuni drăguţe care ne ajuta să facem o treabă mai eficientă cu expresiile regulate şi adaugă un plus la acestea. Nu fac mare lucru, însă te pot ajuta la nevoie ca să nu te complici cu alte moduri mai complicate de şabloane pentru case insensitive, de exemplu.