Validare Cu Expresii Regulate JS

download Validare Cu Expresii Regulate JS

of 17

description

Cascading Style Sheets

Transcript of Validare Cu Expresii Regulate JS

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)