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.

Caractere si elemente PCRE

Cel mai simplu şablon folosit într-o expresie regulată este compus dintr-un singur caracter, de exemplu a. Acest şablon va indica către primul caracter a din şirul text pe care aplicăm expresia regulată. Analog şablonul aa va indica către şirul de caractere aa. Oricum expresiile regulate sunt compuse doar din caractere, totuşi depinde care caracter este cu sensul literal şi care se interpretează şi în ce fel. Desigur, noi vrem să facem mai mult decât atât, spre exemplu să indicăm repetiţii de anumite caractere sau subexpresii. Pentru acest lucru avem nevoie de aşa numitele caractere speciale. Caracterele speciale nu sunt altceva decât nişte caractere rezervate care au rolul de a desemna o repetiţie, spre exemplu. Sau, mai pe scurt, caracterele speciale sunt acele caractere care nu se interpretează literal ci au o semnificaţie simbolică, înseamnă altceva decât par să însemne la prima vedere. Aceste caractere speciale sunt descrise minimal în cele ce urmează:

/ indică un delimitator. Acesta este folosit la începutul şi la sfârşitul expresiei (şablonului) pentru a identifica şablonul de căutare. Spre exemplu avem următorul text de căutat: „programator”. Textul programator este un text oarecare pe când textul /programator/ este un şablon de căutare pentru expresii regulate.

. indică orice caracter (un singur caracter) înafara lui „\n”. Treaba este puţin mai complicată atunci când vine vorba şi e caracterele Unicode şi intră în vorbă şi code pointurile. Asta dacă librăria Unicode este compilată. Voi discuta mai pe larg în cele ce urmează după prezentarea principalelor caractere speciale.

? indică repetarea caracterului sau subexpresiei precedente o dată sau niciodată. Spre exemplu şablonul /programator(bun)?/ poate indentifica următoarele şiruri de texte: programator sau programatorbun. Este un operator lacom.

* indică repetarea caracterului sau subexpresiei precedente niciodată sau de oricâte ori. Spre exemplu şablonul /ab*/ poate însemna abb,a sau chiar abbb (b-ul poate apărea ori de câte ori în textul căutat sau niciodată)

+ caracterul sau subexpresia precedată apare o dată sau de mai multe ori (oricâte ori este nevoie). Spre exemplu şablonul /ab+/ poate identifica abb, abbb însă nu şi ab.

{n} de câte ori apare caracterul sau subexpresia alăturată. Spre exemplu a{2} se găseşte în şirul „aa” dar nu se găseşte în şirul a. Nu se găseşte însă în şirul „aaa” căci caracterul sau subexpresia trebuie să apară de un număr fix de ori în şirul căutat.

{n,} caracterul sau subexpresia alăturată apare de minim n ori. Spre exemplu a{2,} o să se găsească în şirurile aa, aaa dar nu şi în şirul a.

{n,m} caracterul sau subexpresia alăturată apare de minim n ori şi de maxim m ori.

a|b indică faptul că se caută fie a, fie b.

[abc] indică orice caracter dintre cele in paranteza pătrata: a, b, c. Spre exemplu /[abc]/ găseşte pe a în cuvântul programator.

[^abc] indică orice caracter care nu este în setul de caractere a, b, c.

[a-c] indică un şir de caractere şi anume toate caracterele de la a la c: a, b, c.

[^a-c] indică tot un şir de caractere însă şirul de caractere care nu include şirul a, b, c. Combinaţiile între clasele sau seturile de caractere sunt posibile ca în exemplul următor: /[a-c9ef]/. În acest caz caracterele din clasă vor fi a, b, c, 9, e, f.

Dacă vrem să folosim oricare dintre aceste caractere în modul literal, în RegEx, trebuie să indicăm asta într-un fel şi anume un backslash în faţă. Spre exemplu dacă vrem să căutăm bucata de text „Ce faci?” trebuie să avem în vedere că ? este un caracter special şi dacă nu are blackslash în faţă înseamnă altceva decât ? la modul literal. RegExul este totuşi valid, însă rezultatul nu va fi cel probabil aşteptat. Dacă adăugăm backslash şablonul o să fie următorul: Ce faci\?. Dacă eşti programator o să fi surprins că anumite caractere predestinate în alte limbaje precum ghilimele simple sau ghilimele duble nu sunt caractere speciale. Nefiind caractere speciale nu este nevoie să fie scapăate de ele cu blackslash. Putem de exemplu, în loc să stăm să scăpăm cu blackslash de fiecare caracter special în parte să adăugăm \Q şi \E la începutul şi la sfârşitul şirului de caractere de care trebuie scăpat pentru a scăpa de toate şi a ne face viaţa mai uşoară. \E-ul de la sfârşit poate să fie omis deoarece dacă nu există el este subînţeles.

Putem folosi secvenţe de caractere speciale pentru a adăuga caractere non-printabile în şablonul unei expresii regulate. Spre exemplu \t o să indice spre caracterul tab, \e către caracterul escape, \v pentru un tab vertical sau \n pentru sfârşit de linie. Putem include orice caracter în expresia regulată dacă îi ştim codul ASCII, ANSI sau Unicode (dacă suportă motorul de expresii regulate). Ca să putem folosi caractere Unicode avem nevoie să compilăm PCRE cu librăria Unicode căci implicit acesta nu este compilat. Dacă am compilat suportul pentru Unicode putem să introducem caractere în felul următor: \uFFFF. Caracterele Unicode sunt mai degrabă confundate cu code pointuri. Spre exemplu se spune că operatorul punct ar trebui să identifice aproape orice caracter înafară de newline, însă dacă de exemplu nu avem compilată libraria Unicode în PCRE şi avem un caracter cu accent acesta nu va fi bine recunoscut de punct şi expresia regulată nu va returna exact ce dorim noi să returneze. In Unicode caracterele pot fi formate din mai multe code-pointuri şi deci cum punctul se bazează pe code pointuri (când vinde vorba de Unicode) şi de caractere când vine vorba de ASCII nu este o soluţie validă. Există şi sinonimul pentru caractere Unicode şi anume \X. Spre exemplu atunci când vrem să introducem un anumit character şi nu-i găsim semnul pe tastatură putem oricând introduce doar codul în format hexazecimal.

Odată cu trecerea timpului a fost nevoie de majorarea codului ASCII deoarece acesta nu avea loc şi pentru simboluri sau caractere din alte limbi şi a apărut Unicode. Odată cu caracterele Unicode apărea şi avantaje şi dezavantaje. Avantajele ar fi că toate ţările îşi au simbolurile undeva prin code pointurile Unicode şi o posibilă complicaţie ar fi în viziunea programatorului deoarece trebuie să aibă grijă să identifice correct caractere diverse în diverse formate precum Unicode.