Inainte de a prezenta modul de lucru cu RegExp in ActionScript, iata pe scurt cateva notiuni introductive, de baza, despre Expresiile regulate (RegExp - Regular Expresions). Acestea sunt un sir de caractere sablon care descriu multimea cuvintelor posibile care pot fi formate cu acele caractere, respectand anumite reguli. Aceste expresii regulate folosesc paranteze (rotunde, patrate, acolade) prin care formeaza regulile de formare a cuvintelor. Utilitatea cea mai frecventa a unei expresii regulate consta in a recunoaste daca un sir contine sau nu caractere, cuvinte sau sub-sir care se incadreaza in tiparul format prin expresia regulata respectiva.
De ex.: expresia c[eo]r poate forma cuvintele: cer si cor
Un sablon pentru siruri care sa contina doar vocale se poate face utilizand expresia [aeiou] (incluzand valorile posibile intre paranteze). Daca se doreste si permiterea majusculelor, se adauga si acestea [aeiouAEIOU] (sau se poate folosi modificatorul "i", /[aeiou]/i, despre modificatori, mai jos).
Pentru siruri care pot include orice litera scrisa cu minuscule, puteti scrie: [abcdefghijklmnopqrstuvwxyz]. Sau o forma mai compacta [a-z], unde prin cratima "-" se intelege "o serie de caractere consecutive de la 'a' la 'z'".
Similar, tiparul [0-9] reprezinta siruri care contin doar numere.
- Pentru a specifica numarul de caractere pe care un sir il poate contine, din cele incluse in RegExp, se adauga o pereche de acolade in care se includ minimul si maximul numarului de caractere permis.
De exemplu, expresia regulata [aeiou]{1,3} corespunde sirurilor care sunt formate din 1, 2 si 3 vocale.
- Pentru a specifica repetarea mai multor parti ale unei expresii regulate, se includ partile respective intre paranteze rotunde.
De exemplu, ([sm]at){1 ,2} corespunde unui numar de una sau doua repetari ale oricaruia dintre sirurile "sat", "mat".
Exista mai multe caractere speciale care se folosesc la formarea expresiei regulate.
- Daca un accent circumflex (^) este primul simbol mentionat intre parantezele drepte, acesta are ca efect inversarea semnificatiei expresiei regulate plasate intre paranteze.
De exemplu,
[^a-z] corespunde oricarui caracter care nu este o litera mica.
Cand acest caracter este pus in afara parantezelor drepte, el reprezinta inceput de sir sau de linie.
Expresia regulata
^[sm]at corespunde sub-sirurilor "sat" sau "mat" numai daca acestea apar la inceputul sirului subiect.
Similar, pentru a forma o expresie regulata ce corespunde numai unui sir care include anumite caractere la sfarsit, se foloseste un simbol al dolarului "$".
De exemplu,
pa[nr]a$ corespunde sirurilor "pana" sau "para" numai daca acestea apar la sfarsitul sirului subiect.
• Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:
- ^ - indica inceputul liniei
- $ - indica sfarsitul liniei
- . - (punct) orice caracter
- [] - un caracter dintre cele din paranezele patrate
- [^] - orice caracter, in afara celor din paranezele patrate
- \ - adauga in expresie caractere speciale, fara a mai avea rolul lor special
- + - caracterul (expresia) anterior acestui semn se poate repeta cel putin odata si de cate ori e posibil (de la 1 la infinit)
- * - caracterul (expresia) anterior acestui semn se poate repeta de cate ori e posibil sau niciodate (de la 0 la infinit)
- ? - caracterul (expresia) anterior acestui semn se poate repeta ce mult odata
- <> - un cuvant intreg
- (|) - lista de optiuni SAU
- {m, n} - repetarea expresiei de la "m" la "n" ori
- \n - rand nou (pt. Windows e \r\n)
- \t - Tab
- De ex.:
[ca|ma]sa corespunde cuvintelor:
casa si
masa.
- Pentru a adauga aceste caractere in sablonul RegExp, dezactivand rolul lor special, trebuie prefixate cu un caracter backslash (\).
De ex.:
[0-9]\*[0-9] reprezinta o inmultire intre doua numere (* nu mai e factor de repetitie).
• Pe langa aceste caractere exista si formule speciale pentru scurtarea expresiei RegExp:
- \w - Caractere pt. cuvinte (litere, numere si '_'). Echivalent cu [a-zA-Z0-9_]
- \W - Caractere care nu sunt litere, numere sau '_'. Echivalent cu [^a-zA-Z0-9_]
- \s - Spatiu, Tab, Rand-nou. Echivalent cu [\t\n\r ]
- \S - Siruri fara Spatiu, Tab sau Rand-nou. La fel cu [^\t\n\r ]
- \d - Caractere numerice. Ca si [0-9]
- \D - Caractere non-numerice. Ca si [^0-9]
- . - Orice caracter, in afara de rand-nou
- De exemplu:
[\d\s]+ se potriveste sirurilor ce contin doar numere si spatii.
Iata cateva exemple de expresii regulate:
- (.*) - Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *)
- <bine> - Cuvantul "bine"
- (ci|co)tim - Reprezinta "citim" si "cotim"
- ^www.+net$ - Sirurile care incep cu "www" si se sfarsesc cu "net"
- ^www\.[a-z0-9]+\.ro$ - Reprezinta sirurile "www.---.ro" unde '---' poate fi orice litera sau cuvant ce contine litere mici si numere
- (^-\+[0-9]*) - Orice numar care incepe cu "-" sau "+"
- \<tag\>(.*?)\<\/tag\> - Reprezinta continutul dintre <tag>...</tag>
- \<tag\>(.[^\<]+) - Textul de la <tag>, pana la prima "</"
- ^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$ - Expresie regulata pentru adrese de e-mail
In afara de caracterele speciale si formule de scurtare a expresiei se folosesc si modificatori. Acestia sunt cei listati mai jos; ei modifica interpretarea expresiei regulate.
- g - (Global) - determina continuarea cautarii expresiei si dupa prima potrivire
- i - (ignore-case) - nu mai face diferenta intre majuscule si litere mici
- m - (multiline) - schimba rolul lui "^" si "$". Daca multiline nu e specificat, acestia indica inceputul si sfarsitul textului din RegExp, dar cand e adaugat vor indica inceputul si sfarsitul intregii linii
- s - (dotall) - face caracterul punct "." sa reprezinte in expresia RegEsp si rand-nou
- x - (extended) - daca este adaugat, determina ignorarea spatiilor din formula expresiei (util cand se doreste un cod RegExp mai aerisit, dar spatiile sa nu fie interpretate ca spatiu, daca nu sunt prefixate cu '\')
- Acestia se adauga (unul sau mai multi) la sfarsitul exprexiei RegExp, de exemplu:
/\d{3}-[a-z]+/gi (cauta toate sub-sirurile de forma "nnn-cuvant", 'nnn' fiind un numar de 3 cifre iar 'cuvant' poate fi si cu majuscule).
Utilizare RegExp in ActionScript 3
RegExp ( Expresii Regulate ) in ActionScript sunt instante ale clasei RegExp si pot fi definite literal (intre caracterele slash /.../) sau cu operatorul new:
var reg1:RegExp = /expresie-regulata/g;
var reg2:RegExp = new RegExp("expresie-regulata", "g");
Sunt 2 cai prin care expresiile regulate pot fi utilizate in ActionScript: folosind metode specifice din clasa String ("match()", "search()" "replace()"), sau proprietati si metode din clasa RegExp ("test()" si "exec()").
•
test() se foloseste pt. a verifica daca intr-un sir exista sub-sir care sa corespunda cu o expresie regulata, returneaza
true sau
false daca nu exista vreun sub-sir corespunzator expresiei. Sintaxa este:
RegExp.test("sir")
// RegExp cu expresie ce corespunde sablonului: "cuvant-nr3" (nr3 = numar cu 3 cifre)
var reg:RegExp = /[a-z]+-\d{3}/gi;
// Sirurile care vor fi verificate
var sir1:String = 'MarPlo - Cursuri-008 si Tutoriale-137';
var sir2:String = 'AS3 Lectii-37';
// Se verifica cu test() daca in siruri exista sablonul din 'reg'
trace(reg.test(sir1)); // true
trace(reg.test(sir2)); // false
- Dupa cum se vede, metoda trace() arata doar daca in sir exista sau nu vreun sub-sir potrivit expresiei din variabila "reg".
- La 'sir1' returneaza true deoarece "
Cursuri-008" (si "
Tutoriale-037") se potriveste expresiei, dar pt. 'sir2' returneaza false (desi e asemanatoare, numarul nu are 3 cifre).
•
search() (apartinand clasei String) cauta sub-sirul corespunzator expresiei si returneaza un numar ce reprezinta locatia primei aparitii a lui in sir. Sintaxa este:
Sir.search(RegExp)
// RegExp cu expresie ce corespunde sablonului: "cuvant-nr3" (nr3 = numar cu 3 cifre)
var reg:RegExp = /[a-z]+-\d{3}/gi;
// Sirurile care vor fi verificate
var sir1:String = 'MarPlo - Cursuri-008 si Tutoriale-137';
var sir2:String = 'AS3 Lectii-37';
// Cauta cu search() locatia unui sub-sir dupa expresia din 'reg'
trace(sir1.search(reg)); // 9
trace(sir2.search(reg)); // -1
- Este returnata locatia primului sub-sir din 'sir1' care corespunde expresiei din 'reg';
Cursuri-008" e gasit ca incepe de la al noualea caracter (primul are locatia 0).
•
exec() returneaza un obiect in care e stocat sub-sirul gasit cat si locatia lui (retinuta intr-o proprietate
index). In caz contrar returneaza
null. Sintaxa este:
RegExp.exec("sir")
Pentru a gasi toate sub-sirurile corespunzatoare expresiei regulate, se combina "
exec()" cu o instructiune "
while", dupa cum se vede in exemplu urmator.
// RegExp cu expresie ce corespunde sablonului: "cuvant-nr3" (nr3 = numar cu 3 cifre)
var reg:RegExp = /[a-z]+-\d{3}/gi;
// Sirul care va fi verificat
var sir1:String = 'MarPlo - Cursuri-008 si Tutoriale-137';
// Variabila in care vor fi retinute rezultatele valide date de exec
var exc:Object;
// Cu exec() se verifica tot 'sir1', printr-o bucla while()
while(exc=reg.exec(sir1))
{
trace(exc[0]+ ' = '+ exc.index); // Returneaza: sub_sir = locatie
}
/* Afiseaza:
Cursuri-008 = 9
Tutoriale-137 = 24
*/
- Daca nu se foloseste cu "while()", "exec()" retine doar primul sub-sir gasit.
•
match() retine intr-un Array secvential sub-sirurile gasite. Daca modificatorul "Global" (g) e adaugat, cauta in tot sirul, daca nu e specificat se opreste la primul element gasit. Daca nici un sub-sir nu e gasit, returneaza
null. Sintaxa este:
Sir.match(RegExp)
// RegExp cu expresie ce corespunde sablonului: "cuvant-nr3" (nr3 = numar cu 3 cifre)
var reg:RegExp = /[a-z]+-\d{3}/gi;
// Sirul care va fi verificat
var sir1:String = 'MarPlo - Cursuri-008 si Tutoriale-137';
// Adauga intr-o variabila tip Array sub_sirurile gasite de match() aplicat cu 'reg' la 'sir1'
var ar_matc:Array = sir1.match(reg);
// Daca 'ar_matc' are cel putin un element, afiseaza pe primul
if(ar_matc.length>0) trace(ar_matc[0]); // Cursuri-008
•
replace() inlocuieste sub_sirul (sau sub_sirurile) ce corespund unei expresii RegExp cu alt continut. Daca modificatorul "Global" (g) e adaugat, cauta in tot sirul, daca nu e specificat se opreste la primul element gasit. Returneaza sirul modificat, dar nu-l afecteaza pe cel original. Sintaxa este:
Sir.replace(RegExp, 'un_sir')
// RegExp cu expresie ce corespunde sablonului: "cuvant-nr3" (nr3 = numar cu 3 cifre)
var reg:RegExp = /[a-z]+-\d{3}/gi;
// Sirul care va fi utilizat cu replace()
var sir1:String = 'MarPlo - Cursuri-008 si Tutoriale-137';
// Adauga intr-o variabila tip String sirul rezultat dupa inlocuirea partilor ce corespund expresiei din 'reg'
var sir1_mod = sir1.replace(reg, 'alt_text');
// Verifica cu trace sirul initial si pe cel cu rezultatul modificat
trace(sir1); // MarPlo - Cursuri-008 si Tutoriale-137
trace(sir1_mod); // MarPlo - alt_text si alt_text
- Din rezultate se observa ca sirul original ramane neschimbat, dar se obtine si cel cu inlocuirea facuta.
Fisierul FLA cu exemple din aceasta lectie poate fi descarcat de la:
RegExp - ActionScript.