Sunteți pe pagina 1din 17

Expresii regulate

Expresiile regulate sunt abloane de text ce pot fi cutate n iruri de caractere.


Aceste abloane pot fi:
- simple succesiuni de caractere, care vor fi cutate n irul int;
- reguli, pentru care se va cuta:
o primul subir care corespunde regulii, la cutarea normal;
o toate subirurile ce corespund regulii, dac se activeaz cutarea
global.
Cutrile pe baz de expresii regulate pot fi utilizate pentru a obine:
- poziia (din irul int) la care s-a detectat ablonul cutat;
- primul subir detectat n irul int, corespunztor ablonului cutat;
- toate subirurile detectate, n cazul cutrii globale;
- compararea (cu rezultat true sau false) ntre irul int i ablon, pentru a
verifica dac irul respect anumite regulile ablonului ( validarea
formularelor!)
- substituirea n irul int a poriunilor ce corespund ablonului;
- spargerea irului int n mai multe subiruri, la poziiile la care se detecteaz
combinaii de caractere ce corespund ablonului.
n general, expresiile regulate au fost concepute pentru a asigura o procesare ct
mai rapid i facil a irurilor de caractere, eliminnd necesitatea utilizrii funciilor
clasice de procesare a stringurilor (precum indexOf, at, substr etc). Expresiile
regulate sunt suportate de majoritatea limbajelor de programare curente, cu unele
diferene sintactice:
n unele limbaje, expresiile regulate sunt ele nsele stringuri (delimitate cu
ghilimele);
n alte limbaje, printre care JavaScript, expresiile regulate sunt delimitate prin
slashuri (/../)
JavaScript ofer dou moduri de a executa cutri prin expresii regulate:
funcii care aparin expresiilor regulate i primesc ca argumentul irul int
(test, exec)
funcii care aparin stringurilor i primesc ca argument expresia regulat
(match, replace, split).
Mai multe detalii (inclusive exemple despre cum se aplic expresiile regulate n alte
limbaje) gsii la:
http://www.regular-expressions.info/javascript.html

Funcii care aparin expresiilor regulate


Pentru executarea urmtoarelor exerciii nu vom crea o pagin complet, ci doar un
fiier cu marcatorul SCRIPT pentru a putea executa codul JavaScript:

<script>
sir='banana' -> sirul tinta
sablon=/an/ ->expresia regulata
rezultat=sablon.test(sir) ->functia test (true/false)
alert(rezultat) ->afiseaza rezultatul cautarii
</script>
Obs:
n prima linie am definit irul int, n care va avea loc cutarea;
n a doua linie am definit expresia regulat (combinaia care se va cuta este
an);se observ delimitarea cu slash;
n a treia linie am executat funcia test care returneaz valori booleene: true
dac se gsete combinaia, false dac nu.
ultima linie afieaz rezultatul cutrii.
La executare (prin deschidere n browser) ar trebui s se obin true, deoarece an
apare n banana
n urmtorul exemplu, nlocuii funcia test cu funcia exec:
<script>
sir='banana'
sablon=/an/
rezultat=sablon.exec(sir)
alert(rezultat)
</script>
Funcia exec returneaz prima combinaie care s-a gsit, adic an. Desigur, n
acest caz combinaia gsit e aceeai cu cea cutat, dar expresiile regulate pot
deveni mult mai complicate, cu diverse coduri i reguli de cutare care permit s se
gseasc mai multe combinaii corespunztoare aceleiai reguli. Vom reveni ulterior
la astfel de exemple.
nlocuii linia de afiare cu urmtoarea:
alert(rezultat.index)
Proprietatea index a rezultatului returnat de exec() indic poziia pe care s-a gsit
rezultatul (poziia 1 n cuvntul banana, considernd prima liter ca avnd poziia 0).
Alte proprieti utile ce pot fi folosite dup ce s-a executat o cutare sunt
sablon.source (ne d expresia regulat sub form de string) i rezultat.input (ne d
irul int). Urmtorul exemplu compune un text cu toate informaiile pe care s-a
bazat cutarea:
<script>
sir='banana'
sablon=/an/
rezultat=sablon.exec(sir)
alert("S-a cautat combinatia "+sablon.source+" in sirul "+rezultat.input+
" si s-a gasit rezultatul "+rezultat+" la pozitia "+rezultat.index)
</script>

Dac dorim s se gseasc toate rezultalele (sunt 2 combinaii an n banana),


trebuie s se activeze cutarea global, atand litera g la finalul expresiei regulate.
Aceasta va permite ca:
funcia exec s fie apelat de mai multe ori i la fiecare apel cutarea s
continue de unde a rmas precedentul apel;
cutarea s se fac ncepnd de la o anumit poziie.
<script>
sir='banana'
sablon=/an/g
rezultat1=sablon.exec(sir)
rezultat2=sablon.exec(sir)
alert(rezultat1+" a fost gasit la pozitia"+rezultat1.index+"\n"
+rezultat2+" a fost gasit la pozitia"+rezultat2.index)
</script>
Obs:
s-a ataat opiunea g la ablon, pentru a activa cutarea global;
s-a apelat funcia exec de 2 ori, ceea ce a detectat ambele apariii ale lui an
mpreun cu poziiile (al doilea exec continu cutarea de unde s-a oprit
primul!).
Evident, de obicei nu tim de cte ori trebuie s apelm funcia exec pentru a gsi
toate rezultatele. Pentru aceasta avem dou soluii:
includem apelarea funciei ntr-un ciclu while, pn cnd exec nu mai
returneaz nimic (returneaz null);
folosim funcia match (vezi capitolul urmtor) care e mai comod la cutarea
global deoarece caut TOATE soluiile i le returneaz ca un vector (fr s
trebuiasc apelat de mai multe ori).
Urmtorul exemplu realizeaz cutare global ncepnd de la poziia 2:
<script>
sir='banana'
sablon=/an/g
sablon.lastIndex=2
rezultat=sablon.exec(sir)
alert(rezultat+" a fost gasit la pozitia "+rezultat.index)
</script>
Dup cum se vede, prin proprietatea lastIndex a ablonului se poate fixa punctul de
ncepere a cutrii n irul int. Modificarea lui lastIndex e posibil doar la cutare
global (chiar dac apelm exec o singur dat, deci cutm un singur rezultat).
Funcii care aparin stringurilor
n urmtorul exemplu, folosii funcia match() i inversai ablonul i irul int n
apelarea sa:

<script>
sir='banana'
sablon=/an/
rezultat=sir.match(sablon)
alert(rezultat)
</script>
Deoarece funcia match aparine clasei stringurilor, de data aceasta irul apeleaz
funcia i ablonul apare ca argument.
Rezultatul este acelai ca n cazul lui exec se returneaz prima combinaie gsit.
Avantajul fa de exec e c face cutarea global mai simpl se returneaz
TOATE rezultatele ntr-un vector (i putem afla numrul de soluii, putem accesa
ultima soluie sau oricare dintre ele pe baza poziiei n vector etc.). Dezavantajul e c
nu permite stabilirea unui punct de ncepere a cutrii:
<script>
sir='banana'
sablon=/an/g
rezultat=sir.match(sablon)
alert("numarul de solutii este "+rezultat.length+":"+rezultat)
</script>
Rezultat: numarul de solutii este 2: an,an (vectorul a suferit o conversie implicit n
string la afiare, dar poate fi parcurs i n mod clasic, pe baz de poziie: rezultat[0],
rezultat[1] etc.)
Funcia replace realizeaz substituirea combinaiei gsite cu un ir oarecare (aici cu
litera x) i returneaz irul int cu modificarea fcut:
<script>
sir='banana'
sablon=/an/
rezultat=sir.replace(sablon,"x")
alert(rezultat)
</script>
Rezultat: bxana
Varianta cu cutare global:
<script>
sir='banana'
sablon=/an/g
rezultat=sir.replace(sablon,"x")
alert(rezultat)
</script>
Rezultat: bxxa

Funcia split sparge irul int n fragmente delimitate de combinaia cutat.


Fragmentele sunt returnate sub form de vector:
<script>
sir='bandana'
sablon=/an/
rezultat=sir.split(sablon)
alert(rezultat)
</script>
Rezultat: b,d,a
Spargerea nu face diferene ntre cutarea simpl i global!
Funcia search returneaz poziia la care s-a gsit combinaia, deci practic e acelai
lucru cu o apelare exec urmat de citirea propriet ii index:
<script>
sir='bandana'
sablon=/an/
rezultat=sir.search(sablon)
alert(rezultat)
</script>
Rezultat: 1
Nu se face distincie la cutarea global!
Toate aceste funcii, ce aparin clasei stringurilor pot fi folosite i normal, cu un string
n loc de expresia regulat:
De exemplu, split este frecvent folosit n 2 cazuri particulare:
rezultat=sir.split('')
sparge irul n caracterele componente (delimitatorul e irul vid, ntre 2 apostroafe!).
rezultat=sir.split('')
sparge irul n cuvinte (delimitatorul e spaiul)
Funcia opus spargerii este join, care reunete elementele unui vector ntr-un
string, lipindu-le cu ajutorul unui delimitator. mbinnd split cu join, obinem acelai
rezultat ca i cum am executa un replace (evident, split i join sunt mai utile luate
separat dect mbinate n acest mod):
<script>
sir='bandana'
sablon=/an/
rezultat=sir.split(sablon)
lipire=rezultat.join("x")
alert(lipire)
</script>
Rezultat: bxdxa

i celelalte funcii pot fi utilizate fr abloane: sir.search(x)va cuta poziia


caracterului x, sir.replace(a,x) va substitui toate caracterele a cu caractere x.
Cutarea case-insensitive
Dac dorim s nu se fac diferena ntre litere mari i mici, dup expresia regulate se
adaug litera i:
n urmtorul caz se gsete doar o soluie la cutarea global (o combina ie AN):
<script>
sir='bANana'
sablon=/AN/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
n urmtorul caz ns, se gsesc amndou (AN i an):
<script>
sir='bANana'
sablon=/AN/gi
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Diferena const n litera i ataat la finalul expresiei regulate (alturi de g, dar nu e
obligatoriu s apar i g). n general zona de dup al doilea slash al expresiei
regulate e rezervat pentru astfel de op iuni suplimentare simbolizate prin diverse
litere.
Cutarea ancorat
Toate exemplele de pn acum au cutat o combinaie de caractere pe care am
indicat-o explicit n ablon. De aceea, combinaia cutat a fost identic cu cea
gsit. ablonul mai poate lua i forma regulilor, prin care se pot gsi mai multe
combinaii de caractere ce respect un anumit model.
Una din cele mai frecvente e regula de cutare ancorat, prin care putem preciza
c:
rezultatul s fie cutat DOAR la nceputul irului int;
rezultatul s fie cutat DOAR la sfrit;
rezultatul s fie ancorat i la nceput i la sfrit (deci irul int s corespund
regulii pe toat lungimea).
Codul pentru ancora de nceput este ^, codul pentru ancora de sfrit este $:
<script>

sir='bandana'
sablon1=/^an/
sablon2=/an$/
rezultat1=sir.match(sablon1)
rezultat2=sir.match(sablon2)
alert("Primul rezultat:"+rezultat1+"\n Al doilea rezultat:"+rezultat2)
</script>
Rezultatele sunt nule, deoarece bandana nu ncepe cu an i nu se termin cu
an.
Modificnd abloanele, ne putem convinge c cele dou cutri au loc doar pe
poziiile de nceput i sfrit:
<script>
sir='bandana'
sablon1=/^ban/
sablon2=/ana$/
rezultat1=sir.match(sablon1)
rezultat2=sir.match(sablon2)
alert("Pozitia pt primul rezultat:"+rezultat1.index+"\nPozitia
rezultat:"+rezultat2.index)
</script>

pt

al

doilea

Acum ambele abloane sunt gsite.


Dac folosim ambele ancore, n loc s aib loc o CUTARE, are loc o COMPARARE
ntre irul int (pe toat lungimea sa) i expresia regulat. Aceast metod e folosit
la validarea formularelor, pentru a vedea dac ce a introdus utilizatorul respect o
anumit structur (i nimic altceva n afara structurii permise nu e acceptat).
Cutarea dup clase de caractere
O clas de caractere e ncadrat ntre paranteze ptrate i este lociitor pentru
oricare din elementele sale, dar numai pentru UNUL. Elementele unei clase pot fi
indicate:
prin enumerare: [a2x] (se accept oricare, dar nu mai mult de UNUL, dintre
caracterele a,2,x)
prin interval: [a-h] (se accept O liter din intervalul a-h);
prin negare: [^1-5] (se accept orice caracter, dar nu mai mult de UNUL,
diferit de cifrele intervalului 1-5);
orice combinaie ntre cele de mai sus.
Exemple:
[abc] este clasa literelo ra,b i c;
[a-z] este clasa literelor de la a la z;
[0-5] este clasa cifrelor de la 0 la 5;
[x;2-5] este clasa caracterelorx,;i a cifrelor de la 2 la 5;
[a-zA-Z] este clasa tuturor literelor, att mari ct i mici.

Aceste clase pot fi negate, cu caracterul ^:


[^0-5] este clasa tuturor caracterelor care NU sunt cifre de la 0 la 5;
[^a12]esteclasa tuturor caracterelor care NU sunt litera a, cifrele 1 sau 2;
[^aA-F] esteclasa tuturor caracterelor care NU sunt litera a (mic) i nici majuscul
ntre A i F.
Dac printre elementele clasei dorim s indicm i caractere cu semnificaii speciale
(ex: ^,-,]), acestea vor fi prefixate cu \ (inclusive caracterul \, care astfel se dubleaz).
[^1-5\-\\] este clasa tuturor caracterelor care NU sunt cifre de la 1 la 5, cratim
(simbolizat cu prefix: \-) i backslash (simbolizat cu prefix: \\).
Important: nu confundai utilizarealui ^ pentru negarea clasei (apare n interiorul
parantezelor ptrate) cu utilizarea sa pentru ancorare (apare la nceputul
ablonului).
Pentru clase foarte populare exist diverse coduri speciale:
\d e echivalent cu clasa [0-9] (caut o cifr);
\D e echivalent cu clasa [^0-9] (caut un caracter care nu e cifr);
\s va cuta un caracter alb (spaiu, tab, enter etc.);
\S va cuta un caracter non-alb;
\w e echivalent cu clasa [a-zA-Z0-9_] (caut un caracter alfanumeric sau un
underscore);
\W e complementul lui \w (caut orice caracter care nu e liter, cifr sau
underscore);
Observai c majusculele sunt folosite la coduri complementare literelor mici ( \D e
negarea lui \d)
<script>
sir='bandana67'
sablon=/\d/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
S-a realizat o cutare global a caracterelor din clasa \d (echivalent cu [0-9]). Se
vor gsi 2 soluii, cifrele 6 i 7.
<script>
sir='banana99'
sablon=/[a0-9]/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
S-a cutat global orice caracter a SAU o cifr din intervalul 0-9. Se gsesc 5 soluii
(3 de a i 2 cifre).

Cutarea dup grupuri


Spre deosebire de clas, grupul de caractere e ncadrat n paranteze rotunde i toate
caracterele din el trebuie gsite n ordinea dat de grup (n timp ce din clas trebuie
gsit un singur caracter).
<script>
sir='banana99'
sablon=/(an)/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Se gsesc 2 apariii ale grupului an. Desigur, se poate argumenta c nu e nevoie
de grupuri pentru a cuta o succesiune de caractere. E suficient s folosim expresia
regulat /an/ n exemplul de fa.
Discutm n continuare diferenele:
La cutarea simpl (neglobal), pe lng soluia gsit, se returneaz i subsoluii
corespunztoare fiecrui grup:
<script>
sir='xxbanana99xx'
sablon=/b(a[a-z])an(a[0-9])/
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
S-a cutat o combinaie format din:
b,
apoi un grup de 2 caractere din care primul e a, al doilea e orice liter mic
apoi an,
apoi un grup de 2 caractere din care primul e a, al doilea e orice cifr;
Dei cutarea nu mai este global, avem totu i 3 solu ii. ns nu sunt 3 solu ii gsite
de expresia regulat, ci:
Soluia principal, a expresiei regulate n ansamblul su (banana9);
Subsoluia corespunztoare primului grup (an);
Subsoluia celui de-al doilea grup (a9).
Deci grupurile funcioneaz ca nite subexpresii regulate (fiecare grup d i o solu ie
individual, indiferent de ce gsete expresia n ansamblul su). Dar, repetm, acest
lucru e valabil doar la cutarea simpl, neglobal, cu match().
Mai mult, aceste subsoluii pot fi reutilizate n aceeai expresie:
<script>
sir='4004xx5006xx8008'
sablon=/([0-9])00\1/g
rezultat=sir.match(sablon)

alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)


</script>
S-a cutat:
Un grup format dintr-o cifr (oricare);
Apoi, un ir de 2 zerouri;
Apoi, se repet rezultatul grupului (\1 e un cod ce se traduce prin rezultatul
primului grup din expresia regulat; dac apar mai multe grupuri n aceea i
expresie, codurile \1, \2, \3 etc. reprezint subsolu iile individuale ale fiecrui
grup i pot fi reutilizate n aceeai expresie).
Fiind cutare global, acest exemplu va da solu iile 4004 i 8008 (sunt singurele
combinaii care au n mijloc 2 zerouri i ncep i se termin cu aceea i cifr).
([0-9])00\1
Dac am fi folosit expresia [0-9]00[0-9], ne gsea i soluia 5006 (deoarece ncepe i
se termin cu cifr i are 2 zerouri n mijloc). n schimb grupul reutilizat ne permite
s avem garania c a patra cifr e exact aceea i cu prima.
Dac dezactivm cutarea global, vom primi rezultatele 4004 (prima solu ie gsit)
i 4 (subsoluia reutilizat a grupului).
Alte avantaje ale grupurilor:
Permit s se stabileasc un numr de repeti ii pentru grup (de ex., s se
testeze dac an apare de 2 ori);
Permit s se aplice un SAU logic ntre mai multe grupuri;
<script>
sir='banana99'
sablon=/(a[a-z])|(a[0-9])/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
n acest exemplu avem 2 grupuri:
(a[a-z]) grup de 2 caractere dintre care primul este a, al doilea este orice
liter mic;
(a[0-9])- grup de 2 caracteredintre care primul este a, al doilea este orice
cifr.
ntre ele s-a aplicat operatorul SAU | , deci se vor gsi combinaii corespunztoare
ambelor grupuri 3 soluii (an,an,a9).
Pentru repetiia grupurilor, vezi mai jos:
Cutarea dup repetiii
Modaliti de indicare a repetiiei:

dac dup un caracter/o clas/un grup urmeaz +, caracterul/clasa/grupul e


obligatoriu(e) i poate s se repete ( + se traduce prin de 1 sau mai multe
ori);
dac dup un caracter/o clas/un grup urmeaz *, devine opional() i poate
s se repete (* se traduce prin de 0 sau mai multe ori);
dac dup un caracter/o clas/un grup urmeaz ?, devine op ional() i NU
poate s se repete (? se traduce prin de 0 sau 1 ori);
dac dup un caracter/o clas/un grup urmeaz {n}, unde n este un numr,
devine obligatoriu(e) i trebuie s apar de n ori;
dac dup un caracter/o clas/un grup urmeaz {m,n}, unde m i n sunt
numere, caracterul/clasa/grupul poate s se repete de de m pn la n ori;
o dac m lipsete, e considerat egal cu zero;
o dac n lipsete, e considerat egal cu infinit.

<script>
sir='xxanananxxanananxxananxxx'
sablon=/(an){3}/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Caut toate apariiile lui ananan (grupul (an) repetat de 3 ori). Gsete 2 soluii (leam boldat s se vad mai uor).
<script>
sir='xxanananxxanananxxananxxx'
sablon=/(an){2}/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Caut toate apariiile lui anan (grupul (an) repetat de 2 ori). Gsete 3 soluii (le-am
boldat s se vad mai uor).
S-ar putea argumenta c n
ananan
ablonul anan are 2 soluii (una la nceput i una ncepnd de la al doilea a).
Totui, funcia match execut cutrile secven ial: a doua solu ie e cutat ncepnd
de la sfritul primeia, deci nu e permis ca solu iile s se intersecteze.
ananan....
Apoi, s-ar mai putea argumenta c n
xxanananxx
Grupul (an) se repet de 3 ori, nu de 2! Acest lucru nu afecteaz regula de repetare
de 2 ori, cci atunci cnd soluia e satisfcut, JavaScript o returneaz fr s se
mai uite ce urmeaz. Deci repetiia {n} s-ar traduce ma idegrab prin returneaz
soluia cu n apariii, indiferent c mai urmeaz i altele . Este asta echivalent cu
returneaz minim n apariii?NU.Diferena se n elege prin compara ie cu urmtorul
exemplu, care ne d minim 2 apariii:

<script>
sir='xxanananxxanananxxananxxx'
sablon=/(an){2,}/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Diferenele sunt:
n exemplul precedent am avut (an){2}i3 soluii anan(ignornd faptul c la
unele din soluii continu repetiia);
n exemplul acesta avem (an){2,}, care nseamn repetare de minim 2 ori i,
dac e mai mult, se returneaz mai mult (2 solu ii ananan i 1 soluie
anan).
<script>
sir='xxanxxananxxananananxxx'
sablon=/(an){2,3}/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii: anan i ananan (boldate)
Acum s-au cutat repetiiile de 2-3 apariii ale lui an. Din nou, nu conteaz c la
ultima soluie sunt de fapt 4 repeti ii JavaScript ia bucata care satisface regula i
ignor orice urmeaz. Deci nu cdei n capcana de a considera c {2,3} nseamn
returneaz minim 2, maxim 3, ci returneaz minim 2, pn la 3, indiferent dac
exist i mai mult de 3.
<script>
sir='xxanxxananxxananananxxx'
sablon=/x(an)+/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii: xan, xanan, xanananan
Am cutat o repetiie de tip {1,infinit} (se poate exprima i prin {1,})
<script>
sir='xxanxxananxxananananxxx'
sablon=/x(an)*/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii:x,xan,x,xanan,x,xanananan,x,x,x
Am cutat toate x-urile urmate de 0 sau mai multe apari ii ale lui an
<script>

sir='xxanxxananxxananananxxx'
sablon=/x(an)?/g
rezultat=sir.match(sablon)
alert("Rezultatelegasitesunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii:x,xan,x,xan,x,xan,x,x,x
Am cutat toate x-urile urmate de 0 sau 1 apari ie a lui an (din nou, nu maxim 1, ci
1 apariie, indiferentdac urmeaz i altele).

Cutarea cu caractere generice


Caracterele generice permise sunt:
.(punctul, reprezint ORICE caracter de fapt e clasa tuturor caracterelor);
.* (repetiia aplicat punctului reprezint ORICE ir de caractere, de ORICE
lungime, inclusiv irul vid).
<script>
sir='xxanxxananxxananananxxx'
sablon=/x..x/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii: xanx
Am cutat un x, urmat de 2 caractere oarecare, urmate de nc un x
<script>
sir='xxanxxananxxananananxxx'
sablon=/x.{2}x/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Aceleai soluii ca mai sus, aceeai cutare (2 caractere admise ntre x-uri).
<script>
sir='xxanxxananxxananananxxx'
sablon=/x.?x/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii:xx,xx,xx,xxx
Am cutat dou x-uri cu 0 sau 1 caractere ntre ele.
<script>
sir='xxanxxananxxananananxxx'
sablon=/x.*x/g
rezultat=sir.match(sablon)

alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)


</script>
Soluii: xxanxxananxxananananxxx
Am cutat dou x-uri cu ORICTE caractere ntre ele (ct mai multe!)

Cutri greedy i minimale


Dup cum am vzut n exemplul precedent, n general expresiile cu repetiie
returneaz CT MAI MULT posibil (se zice c avem cutare de tip greedy).
Dac vrem s se returneze CT MAI PUIN posibil, indicatorul de repeti ie trebuie
urmat de ?.
Exemplul de mai jos e identic cu cel precedent dar am nlocuit cutarea lacom cu
cutarea minimal:
<script>
sir='xxanxxananxxananananxxx'
sablon=/x.*?x/g
rezultat=sir.match(sablon)
alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)
</script>
Soluii:xx,xx,xx,xx
Cutarea e la fel ca cea de dinainte (ORICTE caractere ntre 2 x-uri) dar acum se
returneaz soluille cu ct mai puine caractere (n acest caz, nimic ntre x-uri, cci
repetiia de tip * accept i zero apariii).
La fel se aplic i la celelate tipuri de repeti ii:
+? (returneaz minim 1, maxim infinit, dar ct mai aproape de 1);
{n,m}? (returneaz minim n, maxim m, dar ct mai aproape de n);
{n,} (returneaz minim n, maxim ORICT, dar ct mai aproape de n).
Reminder final: nu uitai c toate caracterele speciale discutate aici trebuie prefixate
cu \ dac vrem s le cutm efectiv (ignorndu-le semnifica iile speciale). A adar,
pentru a cuta efectiv un punct, respectiv un plus, folosim \.i \+.
Aceste prefixri nu sunt necesare n interiorul claselor dect pentru caracterele care
au semnificaii special n clase: \^(negarea clasei) sau\](inchiderea clasei) sau\(interval).
Deci putem avea:
/[+.?]/
(caut apariia UNUIA din caracterele plus, punct i semnul ntrebrii)
n schimb n afara clasei avem nevoie de
/\+\.\?/
(caut o succesiune de plus, punct i semnul ntrebrii)

Validarea textboxurilor cu expresii regulate


Urmtorul exemplu valideaz un textbox n care TREBUIE s se tasteze o adres de
e-mail:
<!DOCTYPE html>
<html>
<head>
<script>
function valideaza(valoare)
{
sir=valoare
sablon=/^.+@.+\.[A-Z]{2,4}$/i
rezultat=sablon.test(sir)
if (rezultat)
alert("valid")
else
alert("invalid")
}
</script>
</head>
<body>
Email:
<input type="text" name="email" onblur="valideaza(this.value)"/>
</body>
</html>
Observaii:
Validarea datelor introduse n formulare se realizeaz cu funcia test care ne
indic (prin rezultat true sau false) rezultatul compara iei;
Pentru a se face comparaie (i nu cutare n interior), expresia se ancoreaz
cu ^ i $
o dac uitm ancorele, se va testa dac textul tastat CON INE o adres;
o n prezena ancorelor se verific dac textul tastat ESTE o adres (de
la un capt la altul i fr nimic pe lng).
Nu uitai ce am indicat n fiierele js6 i js7 privind validarea:
o La evenimentul onblur, se aplic verificarea i se genereaz un
indicator de eroare (dar preferabil cu innerHTML i nu cu alert);
o Apoi la evenimentul onsubmit se numr erorile detectate de onblur i
se blocheaz trimiterea (cu un mesaj e eroare).
o Totui, aici vom folosi alerte la onblur pt a simplifica exemplul (nu mai
crem un formular complet).
Expresia regulat pentru email definete ablonul: mcar un caracter n fa a lui @
(numele de adres), mcar un caracter ntre @ i punct (numele de server), minim 2
maxim 4 litere dup punct (domeniul serverului: ro, com, info etc., trebuie s fie litere)
Detalii:
ncepe cu ^, se termin cu $ (ancorarea, explicat deja);

Are la final ataat opiunea i (s nu conteze diferena ntre litere mari i


mici);
ncepe cu.+ (un ir de caractere oarecare, minim 1);
Urmeaz @
Urmeaz .+ (din nou, minim un caracter)
Urmeaz \. (un punct, prefixat pentru a neglija rolul special al punctului)<
Se ncheie cu [A-Z]{2,4} (minim 2, maxim 4 litere am pus doar majuscule,
cci oricum opiunea i va permite s fie i litere mici).

n realitate, aceast validare e o simplificare grosolan. Adresele de e-mail nu pot


avea ORICE caracter n numele de server, de exemplu. Mai mult, numele de server
poate avea subdomenii (ex: econ.ubbcluj.ro).
Un ablon mult mai solid este urmtorul:
/^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z]{2,4}$/i
Detalii:
Clasa de caractere permis a fost restricionat mai realist, conform
standardelor de adrese;
Partea din mijloc (ntre @ i domeniul final) este ([A-Z0-9-]+\.)+
o Adic un grup de 1 sau mai multe caractere...
o ...care la rndul lui se poate repeta de 1 sau mai multe ori(pentru a
permite servere cu subdomenii)
Validarea vrstei:
Pentru a permite doar vrste ntre 18 i 99 ani:
/^(1[89])|([2-9][0-9])$/
Avem 2 grupuri cu un SAU ntre ele:
o Fie cifra 1 urmat de 8 sau 9 (nu mai e necesar cratima, enumerarea
e suficient);
o Fie orice cifr peste 2, urmat de orice cifr.
Atenie, ai putea fi tentai s validai vrsta cu o expresie mult mai simpl:
/^[0-9]{2}$/
Aceasta va permite ns orice combinaie de 2 cifre, de la 00 la 99!
Validarea mpotriva casetelor goale:
Urmtoarea regul nu va permite s se lase o caset goal, sau s se tasteze n ea
doar tab, enter sau spaiu:
/\S/

Nu s-au mai folosit ancorele: se verific dac textboxul CON INE mcar un caracter
vizibil (\S e clasa caracterelor vizibile, \s e clasa caracterelor invizibile).

Linkuri utile:
Colecie de expresii regulate:
http://www.roscripts.com/PHP_regular_expressions_examples-136.html
Prezentare comparativ a expresiilor
programare:
http://www.regular-expressions.info

regulate

diverse

limbaje

de

S-ar putea să vă placă și