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.

Sintaxa PCRE

Ce este un şablon de căutare? Indiferent că este folosit cu librăria PCRE sau POSIX un şablon de căutare are aceeaşi utilitate. Cred că un exemplu ar lămuri mai bine:  să presupunem că vrem să verificăm dacă o adresă de e-mail este validă. Ca o adresă de e-mail să fie validă trebuie să arate cam aşa “adresa_email@domeniu” şi să nu arate aşa “@domeniu..”. Spre exemplu adresa adresa_email@site.com pare să se muleze pe primul şablon şi adresa @adresa_nu_e_validă.. pare să se muleze pe al doilea şablon. Prima adresă este validă şi a doua nu. Procesul de verificare a adreselor de e-mail poate fi automatizat foarte uşor folosind expresiile regulate. Prin intermediul funcţiilor PCRE ar trebui să verificăm dacă o oarecare adresă de e-mail se mulează pe şablonul unei adrese de e-mail valide. Deci şablonul de căutare la expresii regulate este o matriţă care ajută motorul RegEx să interpreteze orice fel de şir de caractere. Şablonul de căutare poate să fie înţeles şi ca o formulă sau o serie de simboluri care interpretate ajung la un şir de caractere. Prin intermediul acestor şabloane se pot face căutări în şirurile de caractere sau în fişiere mari.

Timpul de execuţie creşte sau scade în funcţie de modul în care optimizăm şablonul de căutare. Şabloanele de căutare pot fi de la cele mai simple exemple cum ar fi caracterul literal “d” care returnează orice character literal dintr-un şir de caractere până la combinaţii complexe. Un şablon de căutare poate să conţină clase de caractere, negări de clase de caractere, alternări, caractere Unicode şi multe altele. Modul în care este construim depinde doar de necesităţile noastre din acel moment şi imaginaţie. Expresiile regulate sunt o sintaxă care ne permite să facem următoarele chestii: comparaţii complexe de şiruri de text, selectări de şiruri de text sau modificarea acestora.

Puterea expresiilor regulate vine de la abilitatea de a include alternative şi repetiţii în şablonul de căutare. Aceste alternative, repetiţii de text sunt codificate în şablon folosind meta-caracterele. Meta-caracterelor nu înseamnă un text anume care trebuie căutat ci se interpretează într-un anume fel, practic ţin locul altor bucăţi de text. Un exemplu ar fi de folos: să presupunem că avem şablonul programator.. Textul programatore se mulează perfect pe şablonul din exemplu. Dar şi textele programatorb, programatorc. Observăm că într-un şablon folosit de expresiile regulate, avem o bucată de text care se interpretează aşa cum este (programator se interpretează programator la căutarea şirului de text) şi un punct care se interpretează ca orice caracter. Punctul este un meta-caracter. Deci meta-caracterul este un caracter care are un înţeles special pentru motorul expresiilor regulate. Totodată meta-caracterul este şi un prim tip de sintaxă. Sintaxa este poate cel mai important lucru în expresiile regulate. Fără sintaxa potrivită sau fără cunoaşterea sintaxei potrivite, expresiile regulate s-ar putea să nu funcţioneze aşa cum ne aşteptăm sau s-ar putea să nu funcţioneze deloc.

Haideţi să vedem câteva caracteristici importante are PCRE referitoare la şabloane şi sintaxă:

  • reguli de scăpare bine puse la punct: ca şi Perl, PCRE are reguli de scăpre bune. Orice caracter care nu este alfa-numeric poate să fie scăpat (escaped) ca să însemne valoare literală. Scăparea se face cu ajutorul backslashului. Spre exemplu dacă vrem ca un anumit meta-caracter să fie considerat ca şi caracter literal şi nu special, atunci este nevoie să-i facem o scăpare cu un blackslash înainte;
  • clasele de caractere extinse: clasele de caractere care au doar un singur caracter sunt suportate pe lângă denumirile mai lungi POSIX. Spre exemplu clasa \d semnifică orice cifră ca şi digit ar însemna în POSIX [0-9]+pentru expresiile regulate. Aceste două clase înseamnă acelaşi lucru. Văzându-se că se foloseşte frecvent clasa de caractere [0-9] s-a dezolvat clasa de caractere \d care înseamnă acelaşi lucru. Desigur că s-au mai dezolvat şi alte astfel de clase de caractere minimale pentru [a-z] sau [A-Z].
  • Verificare minimală: un caracter ? poate să fie plasat înainte de o secvenţă de repetare pentru a indica faptul ca cea mai mică valoare găsită să fie folosită. Implicit cea mai lungă valore este folosită şi apoi backtrackingul curge spre valorile mai mici.
  • Caractere Unicode şi propietăţi: Unicode defineşte câteva propietăţi pentru fiecare caracter în parte. Bineînţeles că înainte trebuie să avem compilată librăria Unicode în PCRE ca să ne putem folosi de propietăţile Unicode în PCRE.
  • Verificare pe mai multe linii: ^ şi $ pot să verifice doar la începutul şirului de caractere şi la sfârşitul şirului de caractere depinzând de cum opţiunile sunt setate.
  • Newline/breakline opţiuni: atunci când PCRE este compilat se stabileşte implicit un newline. De care newline este depind şi ^ (de început de şir de caractere) şi $ (de sfârşit de şir de caractere). Există mai multe tipuri de newline. În cazul în care avem Unicode putem să folosim o opţiune de encodare pentru a putea verifica deodată orice versiune Unicode de newline. Fără compilarea de Unicode treaba nu funcţionează şi va cere să se compileze Unicode în PCRE ca să poată fi folosit.
  • Referinţe înapoi: un pattern poate să refere înapoi la un rezultat valabil găsit. Mai există şi referinţe înainte care pot fi folosite într-un alt rezultat valabil găsit.
  • Grupuri atomice: grupurile atomice sunt un mod de economisire a timpului de execuţie, deci a minimalizării sau prevenirii backtrackingului din pattern. Trebuie să avem un plan de bătaie deştept pentru a putea să optimizăm pe cât se poate expresia regulată şi timpul de execuţie. Pe lângă grupurile atomice mai pot fi folosiţi şi cuantificatorii posesivi şi ei având cam acelaşi scop şi anume minimalizarea timpului de execuţie şi scăparea pe cât se poate de backtracking.
  • Comentarii: se pot face comentarii cu următorul cod direct în expresia regulată: (?>#comentariu). Aceste comentarii împreună cu parantezele rotunde sunt ignorate, deci rămân văzute doar de programator să-i fie de ajutor în cazul în care expresia regulată construită este prea complexă sau acesta doreşte ca şi alţi programatori să decodifice mai rapid expresia regulată.

Există şi diferenţe faţă de motorul RegEx de la Perl. PCRE a evoluat de la Perl şi apoi a început să evolueze separat, însă nu s-a schimbat major.