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.

RegEx in Perl

Perl este un limbaj de programare creat de Lary Wall in 1987 având ca principal cop procesarea şi manipularea de text, dupa cum îi spune si numele – Practical Extraction and Report Language. Principalul motiv pentru care Perl a ajuns sa aibă succesul actual este implementarea expresiilor regulate într-un mod care oferă o flexibilitate foarte mare şi în acelaşi timp o uşurinţă în utilizare. Putem spune fără să exagerăm că expresiile regulate sunt cele care au adus Perl la nivelul la care este acum.

Pentru lucrul cu expresiile regulate Perl pune la dispoziţie mai mulţi operatori care faciliteaza căutarea şi substituţia textelor. Operatorii cel mai des întâlniţi sunt m//, s/// si qr//, operatori despre care vom vorbi în rândurile de mai jos.

Operatorul m// este folosit pentru căutarea în cadrul textelor pe baza unui şablon specificat între cele două caractere slash ( / ). Textul de procesat este “pasat” operatorului m// prin intermediul operatorilor =~ şi !~. În cazul în care se găseşte o potrivire de şablon, operatorul m// returnează “true”, motiv pentru care poate fi folosit direct în cadrul instrucţiunilor de control. Un exemplu de utilizare ar fi urmatorul:

1
2
3
4
5
6
7
8
#!/usr/bin/perl
 
my $text = 'Expresiile regulate au facut limbajul Perl puternic.';
     $text .= ' Perl este un limbaj flexibil.';
 
if( $text=~ m/Perl/ ) {
    print "Am gasit cuvantul \"Perl\" in text.\n";
}

La rulare scriptul va trebui sa afişeze pe ecran urmatorul mesaj: Am gasit cuvantul “Perl” in text. Trebuie mentionat ca Perl foloseşte operatorul m// ca operator implicit. Astfel operatorul poate lipsi, efectul fiind acelaşi. Deci, dacă înlocuim m/Perl/ cu /Perl/ (observaţi lipsa literei m) expresia va fi valabilă în continuare şi va returna adevărat dacă se găseşte o potrivire de şablon.

Dacă am avea un text mai mare iar cuvantul Perl ar fi scris cu literă mică ar trebui sa facem o regula mai mare, folosind şabloane alternative, cum ar fi perl|Perl. Totuşi, dacă e un text complex s-ar putea ca Perl să fie scris ca PERL sau PeRl sau PerL astfel formându-se un şablon foarte lung şi greu de urmărit. În cazuri de genul acesta putem folosi operatorul i pus la sfârşit, operator care ii spune motorului RegEx că şablonul folosit e case-insensitive, adică nu va face diferenţă între literele mici şi cele mari.

Folosind operatorul i, exemplul de mai sus va deveni:

1
2
3
4
5
6
7
8
#!/usr/bin/perl
 
my $text = 'Expresiile regulate au facut limbajul Perl puternic.';
     $text .= ' Perl este un limbaj flexibil.';
 
if( $text=~ /perl/i ) {
    print "Am gasit cuvantul \"Perl\" in text.\n";
}

Observaţi modificările, şi anume lipsa operatorului m care e implicit, şablonul care e cuvântul perl scris cu litere mici şi operatorul i de la sfârşit care determină tratarea şablonului în mod case-insensitive. După cum bănuiţi, la rulare va fi afişat acelaşi mesaj chiar dacă şablonul este scris cu litere mici.

Bun, acum să mergem puţin mai departe la operatorul s///, operator folosit pentru înlocuiri. Utilizarea acestuia este asemănătoare cu cea a operatorului de căutare, cu menţiunea că oriunde găseşte o potrivire a şablonului dintre primele două caractere slash ( / ) va înlocui rezultatul cu şirul specificat între al doilea şi al treilea slash. Un exemplu ar fi următorul:

1
2
3
4
5
6
7
#!/usr/bin/perl
 
my $text = 'Expresiile regulate au facut limbajul Perl puternic. ';
     $text .= ' Perl este un limbaj flexibil.';
 
$text=~ s/Perl/PERL/;
print "$text\n";

Rezultatul va fi următorul:

Expresiile regulate au facut limbajul PERL puternic. Perl este un limbaj flexibil.

După cum vedeţi textul a fost înlocuit. Totuşi se poate observa o mică problema şi anume faptul că operatorul s// a înlocuit doar primul Perl întâlnit. O soluţie de rezolvare a acestei situaţii ar fi să folosim o buclă while care să înlocuiască Perl cu PERL iar apoi să recitească textul şi să aplice şablonul. Chiar daca nu ar lua decât doua linii de cod în plus nu este o soluţie bună din punct de vedere al resurselor consumate – care vor fi foarte multe daca aveţi de-a face cu texte mari şi multe. O soluţie elegantă ar fi să folosim operatorul g, care ii va spune motorului RegEx să caute toate potrivirile pe şablonul dat iar apoi să le înlocuiască. Astfel, codul de mai sus se transformă în:

1
2
3
4
5
6
7
#!/usr/bin/perl
 
my $text = 'Expresiile regulate au facut limbajul Perl puternic.';
     $text .= ' Perl este un limbaj flexibil.';
 
$text=~ s/Perl/PERL/g;
print "$text\n";

Iar rezultatul va fi:
Expresiile regulate au facut limbajul PERL puternic. PERL este un limbaj flexibil.
Dacă ar fi cazul am putea adăuga şi operatorul i pentru ca şablonul sa nu facă diferenţa între literele mici şi literele mari.

Pentru a forma şabloane complexe Perl foloseşte clase de caractere şi cuantificatori. Cu ajutorul claselor de caractere putem forma foarte uşor un şablon cu ajutorul căruia sa detectăm daca o adresă e-mail este validă sau nu, sau putem verifica daca un şir trimis are se încadrează ca lungime în limitele impuse. Mai jos aveţi o lista de clase de caractere şi cuantificatori folosiţi în Perl.
. Face potrivire pe orice caracter.
\w Face potrivire pe orice caracter folosit într-un cuvânt – caractere alfanumerice şi semnul underscore (_)
\W Face potrivire pe orice caracter care nu e folosit într-un cuvânt – opusul clasei \w
\s Face potrivire pe orice spaţiu
\S Face potrivire pe orice caracter care nu e spaţiu
\d Face potrivire pe orice cifră
\D Face potrivire pe orice caracter care nu e cifră
\024 Face potrivire pe orice caracter scris în mod octal – în cazul nostru caracterul 24
\xcc Face potrivire pe orice caracter scris in hexazecimal – în cazul nostru cc

* Caracterul anterior sau clasa anterioară se repeta de zero sau mai multe ori
+ Caracterul anterior sau clasa anterioară se repeta cel puţin o dată
? Caracterul anterior sau clasa anterioară se repeta o dată sau deloc
{n} Caracterul anterior sau clasa anterioară se repeta de fix n ori
{n,} Caracterul anterior sau clasa anterioară se repeta de cel puţin n ori
{n,m} Caracterul anterior sau clasa anterioară se repeta de cel puţin n ori şi cel mult m ori.

Pentru cazul în care avem  de verificat o potrivire din care ne interesează doar o anumită parte putem folosi gruparea elementelor din şablon folosind parantezele rotunde. Fiecare set de paranteze rotunde e considerat un grup iar după ce se face potrivirea rezultatul va putea fi regăsit într-un set de variabile speciale sub formă de numere. Astfel, primul grup va fi $1, al doilea $2, al treilea $3 etc. Pentru o mai bună înţelegere, urmăriţi exemplul de mai jos:

1
2
3
4
5
6
#!/usr/bin/perl
 
my $text = 'Limbajul Perl a fost creat in anul 1987.';
 
$text=~ /anul (\d+)/;
print "Am extras: $1.\n";

La rulare vom citi pe ecran textul: Am extras: 1987.

Pe scurt, acesta e modul de funcţionare a expresiilor regulate în Perl. Exemplele oferite vă vor ajuta să puneţi în practică expresiile regulate folosind limbajul Perl. Dacă aveţi nevoie de mai mult vă recomand să citiţi pagina de manual a expresiilor regulate în Perl.