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.

Elemente optionale PCRE

Meta-caracterul ? indică repetarea o dată sau niciodată a caracterului precedent. Spre exemplu şablonul programato?r poate identifica şi şirul de caractere programator cât şi şirul de caractere programatr. Exemplele pot continua. Caracterul o de dinaintea meta-caracterului ? poate să lipsească sau să nu lipsească dintr-un eventual şir de caractere care să îndeplinească şablonul dat exemplu. În cazul în care dorim ca mai multe caractere să apară sau să lipsească dintr-un şir de caractere căutat, putem să grupăm caracterele în felul următor: programa(tor)?. Acest şablon va găsi la căutarea într-un şir de caractere atât textul programator cât şi textul programa. Sintagma tor poate de dinaintea meta-caracterului ? poate să apară sau să nu apară. Se pot face şi combinaţii astfel încât mai multe şiruri de caractere să apară sau să nu apară într-un eventual şir căutat, ori mai multe şiruri de caractere cât şi anumite caractere să apară sau nu. Totul ţine de imaginaţia sau nevoile programatorului. Spre exemplu putem crea următorul şablon de căutare: programa(tor)?(bun)? care va returna următoarele răspunsuri: programatorbun, programator, programabun, programa. În cazul în care vrem să verificăm un şir de caractere şi un caracter putem crea următorul şablon: programa(tor)?b(u)?n care va returna următoarele şiruri de caractere: programatorbun, programatorbn, programabun, programa. În momentul în care vrem să facem căutări mai complexe (mai multe şiruri de caractere, mai multe caracatere care să apară sau nu în şirul rezultat) trebuie să fim atenţi la rezultate.

Meta-caracterul + indică repetarea o dată sau de mai multe ori a caracterului precedent. Spre exemplul şablonul programato+r poate identifica şi şirul programator dar şi programatoor, programatooor şi aşa mai departe. Totuşi, şablonul de mai sus nu va identifica şirul de caractere programatr. Spre exemplu putem propune şi expresii care să apară o dată sau de mai multe ori cum ar fi programa(tor)+. Acesta poate să se muleze pe şirurile de caractere programator, programatortor, programatortortor şi aşa mai departe. Putem face şi combinaţii precum: programa(tor)+(bun)+. Desigur, în funcţie de necesitate se pot face combinaţii între diverse meta-caractere, nu numai unul singur. Mai sunt şi alte astfel de caractere. Trebuie dar să avem grijă căci în exemplul de mai sus: programa(tor)+(bun)+ sunt foarte multe şiruri de caracterecare se verifică, defapt numărul lor este nelimitat. Spre exemplu următoarele şiruri de caractere ar verifica şablonul: programtorbun, programatorbunbun, programatortorbun, programatortorbunbunbun şi aşa mai departe. Desigur că poate să existe şi varianta programatortortortortortorbun însă variante de genul programabun nu există aşa cum nu există nici programatortor sau programatortortor. Meta-caracterul + cere ca subexpresia sau caracterul de dinainte să fie prezent măcar odată dar poate apărea de un număr nelimitat de ori.Un concept important din RegEx se numeşte greedy (lăcomie). Meta-caracterul ? este unul lacom. ? oferă motorului RegEx două posibilităţi: fie că identifică şi partea de dinainte de paranteză, fie că nu o identifică deloc. Însă motorul RegEx va încerca de fiecare dată, prima dată, să identifice şirul de caractere şi şirul de dinainte de metacaracterul ?. De aceea îi spune lacom, căci el prima dată încearcă să “înghită” şi şirul de caractere de dinainte de el (de dinainte de ?) şi apoi, dacă observă că nu are ce înghiţi recurge la a doua variantă. Să luăm ca exemplu următorul şir de caractere : “un programator bun este un programatoreficient” şi următorul şablon: programator(eficient)?. Motorul RegEx o să returneze şirul de caractere programatoreficient deşi există şi programator. Este lacom, căci el întâi verifică dacă poate să înghită şi ce este înainte şi mai apoi, dacă nu găseşte, încearcă a doua variantă. Un exemplu în care ar încerca şi găsi a doua variantă este următorul: se dă şirul de caractere “un programator bun este un programatoreficien” şi şablonul: programator(eficient). Cum şirul programatoreficient nu mai este găsit se va returna şirul programator. Meta-caracterul ? nu este singurul lacom. Şi meta-caracterele * şi + sunt lacome.

Că tot am văzut că aşa numitele caractere literare şi clase de caractere identifică un singur caracter sau un singur şir de caractere. Ancorele identifică o poziţie inainte, după sau între caractere. Ele pot fi folosite pentru a ancora rezultatul RegEx la o anumită poziţie. ^ indică prima poziţie din şirul de caractere. Spre exemplu şablonul următor ^a identifică şirul de caractere abc căci îl găsim pe când şablonul următor ^b nu mai identifică şirul de caractere abc căci nu găseşte pe b la început, dar ar putea identifica şirul de caractere bac căci atunci îl găseşte pe b la începutul şirului. Similar $ verifică dacă este la sfârşitul stringului deci a$ nu îl va găsi pe a la sfârşitul şirului de caractere abc.

Comentariile sunt foarte importante în expresiile regulate foarte mari unde vrem să înţelegem peste o perioadă de timp ce am făcut sau să le oferim posibilitatea şi altor programatori să înţeleagă codul. În cazul în care vrem să adăugăm comentarii scriem #text_comentariu. Un comentariu se scrie în felul următor în şablon şi anume (?#text_comentariu) şi este ignorat de motorul RegEx. Acest tip de comentarii cu care probabil majoritatea programatorilor sunt obişnuiţi se găsesc, pe lângă PCRE şi în motorul RegEx de la .NET, Perl, Python sau Ruby. Ca să facem mai vizibilă expresia regulată alături de comentarii putem să adăugăm şi modificatorul pentru free-spacing.

In modul freespacing spaţiile goale sunt ignorate. Spaţiile goale includ şi space-uri, taburi şi \n –uri. Spre exemplul “a b” este acelaşi cu “ab” în acest mod. Modificatorii de grup pentru grupuri atomice nu pot fi sparţi folosin spaţii. Nici clasele de caractere nu mai înseamnă acelaşi lucru dacă lasăm spaţii libere în interiorul acestora. În interiorul classelor de caractere modificatorul free spacing nu are niciun efect. În interiorul expresiilor regulate se pot introduce condiţii precum if,then,else. In cazul în care partea de la if este adevărată atunci se va încerca evaluarea părţii then şi în celălalt caz evaluarea părţii cu else. Sintaxa constă într-o pereche de paranteze rotunde. Dupa paranteza rotundă de deschidere se găseşte un semn de întrebare. Şi aceste condiţii au multe aplicaţii practice care ne vin imediat în minte precum extragerea headerelor de la emailuri. Alte aplicaţii practice stau la îndemnâna oricui are imaginaţie sau nevoie de a rezolva o anumită cerinţă.