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.

Clase si seturi de caractere PCRE

Prin intermediul unei clase de caractere (mai este numit şi set de caractere) putem indica în expresia regulată un anumit caracter din mai multe caractere. De exemplu dacă vrem să ştergem toate vocalele dintr-o propoziţie putem folosi un şablon care conţine vocalele. Şablonul ar arăta în felul următor [aeiou]. Desigur această expresie o putem intercala într-un şir de text sau într-o altă expresie precum: progr[aeiou]mator. Această expresie regulată va găsi şi şirul programator cât şi sirurile progremator, progrimator, progromator, progrumator. Este bine de ţinut minte că un set de caractere va indica decât un singur caracter, nu mai multe. Nu contează ordinea caracterelor din clasă. În cazul în care vrem ca şirul de caracatere indicat să conţină mai multe caractere din clasa de caractere propusă putem să folosim + (care identifică unul sau mai multe caractere din clasa de caractere din faţa acestuia).

Dacă ar fi să definim un set de caractere pentru toate literele din alfabet, la modul în care este prezentat mai sus, am pierde timpul degeaba. Seturile de caractere mai au un caracter special care-şi face bine treaba şi anume . Dacă vrem să definim toate caracterele de la a la z este deajuns să scriem şablonul [a-z] (de la a la z) în loc să scriem toate caracterele de la a la z. Nu este greşit dacă scriem toate caracterele în set, însă este a doua variantă este mai economă din punct de vedere al timpului depus. Dacă vrem să definim toate cifrele putem să scriem şablonul următor [0-9]. Deasemenea putem şi combina mai multe categorii de caractere, cifre. Dacă vrem să indicăm caracterele de la a la d şi cifrele de la 0 la 4 putem să facem în felul următor: [a-d0-4]. Nu este greşit dacă scriem aşa ceva: [abcd01234] rezultatul fiind identic. Putem face şi combinaţii incluzând categorii cât şi caractere de sine stătătoare spre exemplu: [a-dg0-4] în momentul în care unul sau mai multe caractere nu intră în nicio categorie. Ordinea nu este importantă. Un alt exemplu de combinaţie de caractere şi categorii de caractere ar fi următorul: [^a-zA-Z1234]. Ca aplicaţie a seturilor de caractere am putea căuta diferite cuvinte sau expresii chiar dacă nu sunt scrise corect. Se ştie că utilizatorii nu introduc neapărat o singură formă a unui cuvânt sau expresii şi un motor de căutare trebuie să dea rezultate optime. Spre exemplu eu caut cuvântul roşii însă altcineva caută rosi sau roşi. Rezultatul trebuie să fie acelaşi, să ne ducă tot la „conceptul” de roşii, chiar dacă sunt câteva caractere în plus sau în minus.

Există şi aşa numitele clase negate de caractere. Practic toată treaba stă în faptul că de această dată caracterele din set nu sunt căutate, sunt negate. Orice alte caractere înafară de cele din set sunt indicate de respectivul şablon. Important de reţinut că o clasă negată de caractere va indica tot spre un singur caracter ca şi o clasă de caractere. Dacă vrem să negăm o clasă de caractere trebuie să folosim un caracter special şi anume ^. Exemplu: [^abc]. Orice alt caracter înafară de a,b sau c va fi indicat de expresia regulată. Putem face şi combinaţii spre exemplu [^a-c0-9] sau [^1] ori [^a-b]. Dacă negăm o categorie negăm toate caracterele din categorie. Primul exemplu şi anume: [^a-c0-9] se poate descifra în felul următor: unul din caracterele de la 0 la 9 dar nu şi caracterele a,b,c. Singurele metacaractere dintr-o clasă de caractere sunt [] (parantezele care închid clasa), \, ^ şi – (pentru a defini o categorie de caractere, de la, până la). Meta-caracterele sunt caractere normale într-o clasă de caractere şi nu trebuie să fie indicate printr-un backslash. Spre exemplu pentru a căuta caracterul a sau caracterul ? scriem şablonul [a?]. Ştim că într-un şir de text oarecare (care nu se află într-o clasă de caractere) dacă vrem să căutăm a?, la modul literal, trebuie să scriem un şablon de genul: a\?. Nu este greşit dacă adăugăm backslash în faţa meta-caracterelor dintr-o clasă de caractere, insă o astfel de clasă de caractere va fi mai greu de citit. Pentru a include \, [, ], – sau ^ în interiorul unei clase de caractere, cu înţeles literal, trebuie să le indicăm cu un backslash în faţă. Paranteza pătrată de închidere a clasei (]), ^ şi – pot fi incluse şi fără backslash însă numai într-o poziţie care nu afectează înţelesul clasei de caractere. Spre exemplu un caracter ^ ca să nu fie nevoie de backslash îl putem pune oriunde înafară de început (după paranteza pătrată de început). Un exemplu valid ar fi următorul [a-c^]. Acesta indică orice caracter dintre a,b,c şi ^. – poate fi incluse după paranteza de deschidere sau înaintea parantezei de închidere pentru a nu fi nevoie de \. Spre exemplu: [-a-b]. Dacă totuşi vrem să-l includem undeva pe la mijlocul clasei de caractere facem în felul următor: [a-b\-c-d] pentru a nu strica înţelesul firesc.

Pentru că anumite clase de caractere sunt folosite frecvent sau dezvoltat clase de caractere înlocuitoare şi anume \d este folosit pentru a indica clasa de caractere [0-9], \w este folosit pentru a indica un caracter dintr-un cuvânt şi anume [a-z,A-z,0-9_]. Aceste clase minimale pot fi incluse atât în interiorul unei clase de caractere cât şi afară, însemnând acelaşi lucru. Aceste clase minimale pot fi şi negate, ca orice altă clasă de caractere. A nega o clasă \d înseamnă \D dar poate însemna şi [^\d], \W neagă pe \w.

Dacă repeţi un caracter din clasă folosind operatorii ?,* sau + se va repeta întreaga clasă şi nu numai primul caracter care este găsit primul. Spre exemplu [0-3]+ poate identifica în acelaşi timp şi 300 şi 221 căci clasa este repetată de fiecare dată (minim o dată) şi se poate alege de acolo orice alt caracter necontând care este caracterul de dinainte care a fost găsit în şirul de caractere căutat. Se pot face şi alte adăugiri şi integrări ale claselor de caractere în tot felul de situaţii, depinzând şi de nevoile pe care le are programatorul într-un anumit moment. Ca să înţelegem mai bine clasele de caractere putem să observăm şi cum functionează motorul regex atunci când le întâmpină şi luând cât mai multe exemple.