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.

Sabloane alternative, PCRE

Clasele de caractere dintr-un şablon pot indica un singur caracter din mai multe caractere posibile. Totuşi, dacă vrem să indicăm mai multe caractere dintr-un set de caractere? Sau o sintagmă (prin sintagmă înţelegem mai multe caractere) din mai multe sintagme? Cum clasele de caractere nu ne ajută în această situaţie putem folosi conceptul numit alternare. Conceptul de alternare tocmai asta semnifică: căutarea unei sintagme din mai multe sintagme posibile. Spre exemplu dacă vrem să căutăm textul literal programator sau pisică putem face în felul următor folosind alternare programator|pisică. Nu este neapărat o limitare la două sintagme, lista poate să fie mai mare, gen: programator|pisică|om|alternare.

Motorul RegEx se va opri din căutat în momentul în care găseşte un rezultat valid, rezultat care se mulează corect pe şablonul oferit. Trebuie să ţinem cont de acest lucru în momentul în care construim şabloane folosind alternarea, nu care cumva să dorim o rezolvare şi să obţinem răspunsul la o altă problemă. Să luăm un exemplu, să presupunem că vrem să căutăm sintagma programatoreficient în textul „programatoreficient pisică” şi scriem un şablon de genul: pisică|programator|programatoreficient. S-ar putea ca şablonul să nu găsească neapărat tot şirul programatoreficient, chiar dacă acesta se găseşte în şablonul de alternare. Să vedem însă ce o să găsească motorul RegEx. La început motorul RegEx evaluează expresia regulată şi „observă” că în ea este un şablon de alternare. La pasul următor se va verifica fiecare cuvânt din şablonul de alternare până când unul se găseşte în şirul de text căutat. Cum cuvântul pisică nu se găseşte în textul în care căutăm, motorul RegEx va trece mai departe la cuvântul programator. Cuvântul programator va fi returnat căci el se găseşte în textul programatoreficient. Nu contează că în şablonul de alternare se mai găseşte chiar şi şirul de caractere programatoreficient, căci procesul se opreşte. De ce se opreşte? Şablonul de alternare, analog cu clasele de caractere returnează numai o sintagmă din sintagmele disponibile. Odată ce a găsit o sintagmă care se găseşte în textul dat, ce rost mai are să caute o altă sintagmă?

O altă aplicaţie practică a şabloanelor alternative poate să fie următoarea: filtrarea unor cuvinte dintr-o aplicaţie de chat. Să presupunem că avem o listă de cuvinte care vrem să fim înlocuită. Nu este mai uşor să construim o expresie regulată cu respectivele cuvinte iar în momentul în care sunt găsite acestea să fie înlocuite? Bineînţeles că treaba nu este chiar aşa de simplă pe cât pare însă cu puţină muncă putem să ajungem să ne punem în practică cu ajutorul expresiilor regulate orice ideea ne trece prin cap. Trebuie să fim atenţi la ordinea datelor din cadrul şabloanelor alternative dacă vrem să optimizăm treaba. Să presupunem că vrem să căutăm “numeprogramator” şi în şablonul alternativ avem următoarele date (num|numepro|numeprogra|numeprogramator). Este irelevant să avem astfel de valori în şablonul de alternare căci în niciun caz nu vom găsi numeprogramator. Şirul de caractere „num” va fi găsit în interiorul şirului de caractere iniţial “numeprogramator” şi cum este un rezultat valid este şi returnat căci aşa functionează motorul RegEx. În acest caz trebuie să avem grijă ca cel mai mare şir de caractere căutat să fie primul sau printre primele din şablonul de alternare căci astfel riscăm să nu ne alegem cu rezultatul dorit. Aşa se poate întâmpla şi în cazul în care avem următorul şablon: (test|pisică|mun|numeprogramator) şi vrem să căutăm şirul de caractere numeprogramator. Nu are sens ca acesta să fie tocmai la sfârşit căci până atunci motorul RegEx şi aşa lucrează degeaba căci nu este posibil ca una dintre paternurile respective să fie valide. Cum abia ultimul patern este valid se observă că motorul RegEx a parcurs şi a consumat timp degeaba şi programatorul ar fi putut evita acest lucru adăugând pe prima sau pe primele poziţii şirurile de caractere de interes maxim, nu părţi din ele sau altele care nu au legătură cu căutarea. Contează deci şi ordinea şirurilor de caractere din şablonul de alternare pentru eficienţă sporită.

Şabloanele de alternare îşi găsesc exemple practic şi printre grupurile atomice şi modul în care acestea pot fi optimizate pentru un timp de execuţie al expresiei regulate mai mic. Să luăm următorul exemplu de şablon de alternare: \b(value|vla|vv)\b. Să observăm analiza motorului RegEx în cazul de faţă. Să presupunem că avem şirul de caractere values pe care am dori să-l găsim şi vom demonstra că prin intermediul şablonului de mai sus nu vom găsi ceea ce ne aşteptăm, însă vom pierde un timp destul de mare la execuţie să observăm acest lucru. \b înseamnă începutul şirului de caractere şi se potriveşte value cu value. Motorul RegEx ţine cont de faptul că mai sunt alternative şi trece mai departe. Cele două alternative rămase nu sunt valide deci motorul RegEx iese din şablonul de alternare. Observă că e-ul de la value nu este şi s-ul de la values, adică caracterul de sfârşit deci nici primul şir de caractere găsit iniţial nu se potriveşte. Motorul RegEx a pierdut timpul degeaba să afle că nu există niciun şir de caractere care să se muleze pe şirul pe care-l doream. Ca o mică optimizare ar trebui să îi spunem cumva motorului RegEx ca dacă atunci când nu reuşeste să îl găsească pe primul să nu se mai chinuie să le mai caute şi pe următoarele şiruri. În cazul unui grup atomic pe un şablon de alternare motorul RegEx o să verifice primul şir de caractere apoi o să iasă din alternare ca să observe dacă se potriveşe şi cu \b–ul de la sfârşit. Deoarece nu se potriveşte acesta va termina total execuţia. Diferenţa constă în faptul că noi, ca programatori, ştiam că dacă primul nu este atunci nu mai are rost să continue şi am găsit o modalitate să optimizăm algoritmul. Totuşi, în alt context această modalitate s-ar putea să nu optimizeze cât să ofere rezultate eronate sau neaşteptate. De aceea trebuie să lucrăm cu grijă cu şabloanele alternative şi cu eventualele grupuri atomice sau alte expresii regulate ataşate pe ele. Să nu cumva să avem în minte o chestie şi să obţinem altă chestie.