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.

Unicode in PCRE

Unicode încearcă să înglobeze caractere şi simboluri din mai toate limbile pământului. Prin intermediul şablonului Unicode putem să avem la un loc sisteme de scriere pentru toate limbile planetei şi pentru cele care nu mai există. În ziua de azi cum toată lumea doreşte să aibă o versiune în limba propie sau în câteva limbi mai cunoscute, Unicode a început să joace un rol deosebit de important. Astfel utilizatorii pot să definească în programele lor caractere sau simboluri diverse. Asta înseamnă că şi motorul RegEx trebuie să fie în pas cu aceasta. Java, XML şi .Net folosec motoare RegEx care au deja inclus Unicode. PCRE nu vine cu Unicode inclus însă poate să fie compilat şi cu suport pentru Unicode. Acum vine partea drăguţă pentru programatorii care utilizează motorul RegEx şi Unicodurile. Cred că a auzit toată lumea de caracterele cu accent deasupra. Chiar dacă literal se numeşte caracter, din punct de vedere Unicode s-ar putea ca un altfel de caracter să nu fie doar unul singur. Unicode foloseşte noţiunea de ‘code point‘ şi, spre exemplu, caracterele cu accent sunt o sumă de două code pointuri. Asta implică o situaţie destul de dubioasă şi poate într-un fel încurca treburile de până acum ale expresiilor regulate. Spre exemplu punctul identifică orice caracter sau, pentru Unicode, orice codepoint. Deci dacă el identifică orice code point înseamnă că nu va identifica şi aşa zisul caracter cu accent căci acesta este o sumă de două code pointuri. Nu ar fi problema aşa de mare căci nu toate Unicodurile sunt formate din mai multe code pointuri şi dacă sunt formate au şi varianta de un singur code point.

Ştim acum că punctul indică spre un singur caracter sau către un singur code point însă în cazul în care un caracter este format din mai multe code pointuri, în Unicode, atunci punctul nu-şi treaba. Dacă PCRE este compilat cu librăria pentru Unicode atunci putem să folosim \X, versiunea Unicode pentru punctul din motorul RegEx. Cam singura diferenţă care ar fi între punct şi \X este că \X indică şi spre \n pe când punctul nu o face în modul implicit. Punctul foloseşte ASCII şi \x foloseşte Unicode pentru a găsi caracterele căutate. Pentru a indica către un singur code point sau Unicode putem folosi următoarul şablon: \x{FFFF}. Acest tip de şablon este folosit şi de Perl pe când, spre exemplu, Javascript foloseşte un alt mod de verificare Unicode şi anume: \uFFFF. Acest tip de căutare va indica către code pointul din Unicode U+FFFF. Dacă vrem să căutăm code pointul de mai multe ori la rând putem să folosim următorul şablon: \x{FFFF}{număr_de_ori}. Spuneam că Unicode include foarte multe caractere din mai toate limbile cât şi simboluri. Înafară de complicaţii Unicode-ul aduce şi multe lucruri interesante precum posibilitatea de a integra un caracter într-o anumită categorie. Ca să facem acest lucru putem să folosim şablonul următor: \p{} şi ca să nu aparţină unei categorii folosim şablonul: \P{}. Spre exemplu dacă vrem să indicăm doar spre caracterele (şi prin caracter ne referim tot la code pointuri Unicode) din categoria literă avem următorul şablon: \p{L} , dacă vrem să ne referim la toate code pointurile înafară de cele din categoria literă avem şablonul: \P{L}. PCRE este case sensitive şi trebuie să avem grijă când specificăm o anumită categorie cu litere mici şi când cu litere mari. Există şi scurturi şi spre exemplu PCRE, alături de Perl şi Java ne acordă posibilitatea să le folosim şi anume că în loc de \p{literă_categorie sau litere_categorie} se poate folosi \pliteră_categorie. Pentru categoria litere vom avea: \pL. Mai există câteva categorii şi anume: M ( pentru accente, umlauts), S (pentru simboluri, simboluri matematice), N (orice tip de număr), P (semne de punctuaţie).

Există şi aşa numitele scripturi Unicode. Un script este un grup de code pointuri folosite de o naţiune pentru sistemul de scriere. Având acest script ne este mai uşor să identificăm doar code pointurile pentru o anumită limbă sau să verificăm dacă un text este scris într-o limbă, folosind code pointurile limbile respective, sau în alta. Unele limbi sunt compuse din mai multe scripturi Unicode căci au nevoie de mai multe caractere şi simboluri cum e limba japoneză. Ca să verificăm code pointurile dintr-un anumit script putem să folosim următorul şablon: \p{sistem_de_scriere}, exemplu: p\{Latin} pentru sistemul de scriere din latină.

Există şi aşa numitele blocuri Unicode. Blocurile sunt o categorie continuă de code pointuri pe când scripturile Unicode nu necesită neapărat acest lucru. Blocurile pot să conţină şi code pointuri care încă nu sunt asignate şi probabil că vor fi pe viitor. Şabloanele se scriu tot ca la scripturi Unicode, ca în exemplul următor: \p{InLatin_Extended-B}. Acestea pot fi însă folosite de Perl, Java, .NET sau XML căci PCRE nu suportă blocuri Unicode.

Spre exemplu în PCRE pentru a nega o anumită categorie putem să folosim şablonul: \p{^L} însă şi şablonul următor este corect: \P{L}. Cel mai bine de folosit pentru a nega o clasă este să folosim ultimul şablon de mai sus \P{L} căci majoritatea motoarelor RegEx folosesc această notaţie. PCRE şi Perl sunt printre singurele care permit şi notaţia: \p{^L}. Dacă vrem ca şi alţi programatori să înţeleagă şi să nu apară erori de descifrare a şablonului este cel mai bine să folosim standardul general care este folosit în majoritatea motoarelor RegEx pentru denumire şi negare de categorii Unicode. Se pare că Unicode, în ciuda faptului că poate oferi şi câteva complicaţii de înţelegere, oferă şi multe avantaje majore. Oricum, complicaţiile de înţelegere sunt devastate net de avantajele code pointurilor Unicode. Totul depinde de contextul în care viitorul programator abordează o anumită problemă şi necesităţile sale în momentul respectiv. Trebuie să reţinem faptul că PCRE nu vine implicit cu suportul pentru caractere Unicode şi ca pentru aceasta trebuie compilat cu acest suport dacă avem nevoie. În cazul în care este compilat cu acest suport face posibilă utilizarea secvenţelor de scăpare \p{..}, \P{..} şi \X, descrise deja mai sus. O chestie care nu este suportată de PCRE sunt propietăţile prefixate de „Is”. Acestea sunt folosite, spre exemplu, în Perl dar nu şi în PCRE.