validare cu expresii regulate js

Upload: dan-hagea

Post on 21-Mar-2016

11 views

Category:

Documents


0 download

DESCRIPTION

Cascading Style Sheets

TRANSCRIPT

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: primul subir care corespunde regulii, la cutarea normal; 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:

sir='banana' -> sirul tintasablon=/an/ ->expresia regulatarezultat=sablon.test(sir) ->functia test (true/false)alert(rezultat) ->afiseaza rezultatul cautarii

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:

sir='banana'sablon=/an/rezultat=sablon.exec(sir)alert(rezultat)

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:

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)

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.

sir='banana'sablon=/an/grezultat1=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)

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:

sir='banana'sablon=/an/gsablon.lastIndex=2rezultat=sablon.exec(sir)alert(rezultat+" a fost gasit la pozitia "+rezultat.index)

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:

sir='banana'sablon=/an/rezultat=sir.match(sablon)alert(rezultat)

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:

sir='banana'sablon=/an/grezultat=sir.match(sablon)alert("numarul de solutii este "+rezultat.length+":"+rezultat)

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:

sir='banana'sablon=/an/rezultat=sir.replace(sablon,"x")alert(rezultat)

Rezultat: bxana

Varianta cu cutare global:

sir='banana'sablon=/an/grezultat=sir.replace(sablon,"x")alert(rezultat)

Rezultat: bxxa

Funcia split sparge irul int n fragmente delimitate de combinaia cutat. Fragmentele sunt returnate sub form de vector:

sir='bandana'sablon=/an/rezultat=sir.split(sablon)alert(rezultat)

Rezultat: b,d,aSpargerea 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 proprietii index:

sir='bandana'sablon=/an/rezultat=sir.search(sablon)alert(rezultat)

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):

sir='bandana'sablon=/an/rezultat=sir.split(sablon)lipire=rezultat.join("x")alert(lipire)

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 combinaie AN):

sir='bANana'sablon=/AN/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

n urmtorul caz ns, se gsesc amndou (AN i an):

sir='bANana'sablon=/AN/girezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 opiuni 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 $:

sir='bandana'sablon1=/^an/sablon2=/an$/rezultat1=sir.match(sablon1)rezultat2=sir.match(sablon2)alert("Primul rezultat:"+rezultat1+"\n Al doilea rezultat:"+rezultat2)

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:

sir='bandana'sablon1=/^ban/sablon2=/ana$/rezultat1=sir.match(sablon1)rezultat2=sir.match(sablon2)alert("Pozitia pt primul rezultat:"+rezultat1.index+"\nPozitia pt al doilea rezultat:"+rezultat2.index)

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)

sir='bandana67'sablon=/\d/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

S-a realizat o cutare global a caracterelor din clasa \d (echivalent cu [0-9]). Se vor gsi 2 soluii, cifrele 6 i 7.

sir='banana99'sablon=/[a0-9]/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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).

sir='banana99'sablon=/(an)/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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:

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)

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 totui 3 soluii. ns nu sunt 3 soluii 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 soluie 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:

sir='4004xx5006xx8008'sablon=/([0-9])00\1/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 aceeai expresie, codurile \1, \2, \3 etc. reprezint subsoluiile individuale ale fiecrui grup i pot fi reutilizate n aceeai expresie).Fiind cutare global, acest exemplu va da soluiile 4004 i 8008 (sunt singurele combinaii care au n mijloc 2 zerouri i ncep i se termin cu aceeai 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 aceeai cu prima.

Dac dezactivm cutarea global, vom primi rezultatele 4004 (prima soluie gsit) i 4 (subsoluia reutilizat a grupului).

Alte avantaje ale grupurilor: Permit s se stabileasc un numr de repetiii pentru grup (de ex., s se testeze dac an apare de 2 ori); Permit s se aplice un SAU logic ntre mai multe grupuri;

sir='banana99'sablon=/(a[a-z])|(a[0-9])/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 opional() 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; dac m lipsete, e considerat egal cu zero; dac n lipsete, e considerat egal cu infinit.

sir='xxanananxxanananxxananxxx'sablon=/(an){3}/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Caut toate apariiile lui ananan (grupul (an) repetat de 3 ori). Gsete 2 soluii (le-am boldat s se vad mai uor).

sir='xxanananxxanananxxananxxx'sablon=/(an){2}/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 nanananablonul anan are 2 soluii (una la nceput i una ncepnd de la al doilea a). Totui, funcia match execut cutrile secvenial: a doua soluie e cutat ncepnd de la sfritul primeia, deci nu e permis ca soluiile s se intersecteze.ananan....

Apoi, s-ar mai putea argumenta c nxxanananxxGrupul (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 nelege prin comparaie cu urmtorul exemplu, care ne d minim 2 apariii:

sir='xxanananxxanananxxananxxx'sablon=/(an){2,}/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 soluii ananan i 1 soluie anan).

sir='xxanxxananxxananananxxx'sablon=/(an){2,3}/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

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 repetiii 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.

sir='xxanxxananxxananananxxx'sablon=/x(an)+/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii: xan, xanan, xananananAm cutat o repetiie de tip {1,infinit} (se poate exprima i prin {1,})

sir='xxanxxananxxananananxxx'sablon=/x(an)*/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii:x,xan,x,xanan,x,xanananan,x,x,xAm cutat toate x-urile urmate de 0 sau mai multe apariii ale lui an

sir='xxanxxananxxananananxxx'sablon=/x(an)?/grezultat=sir.match(sablon)alert("Rezultatelegasitesunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii:x,xan,x,xan,x,xan,x,x,xAm cutat toate x-urile urmate de 0 sau 1 apariie 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).

sir='xxanxxananxxananananxxx'sablon=/x..x/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii: xanxAm cutat un x, urmat de 2 caractere oarecare, urmate de nc un x

sir='xxanxxananxxananananxxx'sablon=/x.{2}x/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Aceleai soluii ca mai sus, aceeai cutare (2 caractere admise ntre x-uri).

sir='xxanxxananxxananananxxx'sablon=/x.?x/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii:xx,xx,xx,xxxAm cutat dou x-uri cu 0 sau 1 caractere ntre ele.

sir='xxanxxananxxananananxxx'sablon=/x.*x/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii: xxanxxananxxananananxxxAm 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 repetiie trebuie urmat de ?.

Exemplul de mai jos e identic cu cel precedent dar am nlocuit cutarea lacom cu cutarea minimal:

sir='xxanxxananxxananananxxx'sablon=/x.*?x/grezultat=sir.match(sablon)alert("Rezultatele gasite sunt in numar de: "+rezultat.length+" cu valorile: "+rezultat)

Soluii:xx,xx,xx,xxCutarea 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 repetiii: +? (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 semnificaiile speciale). Aadar, 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:

function valideaza(valoare){sir=valoaresablon=/^.+@.+\.[A-Z]{2,4}$/irezultat=sablon.test(sir)if (rezultat)alert("valid")elsealert("invalid")}

Email:

Observaii: Validarea datelor introduse n formulare se realizeaz cu funcia test care ne indic (prin rezultat true sau false) rezultatul comparaiei; Pentru a se face comparaie (i nu cutare n interior), expresia se ancoreaz cu ^ i $ dac uitm ancorele, se va testa dac textul tastat CONINE o adres; 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: La evenimentul onblur, se aplic verificarea i se genereaz un indicator de eroare (dar preferabil cu innerHTML i nu cu alert); Apoi la evenimentul onsubmit se numr erorile detectate de onblur i se blocheaz trimiterea (cu un mesaj e eroare). 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 faa 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)