Documente Academic
Documente Profesional
Documente Cultură
<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>
<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
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
<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).
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