Skip to content

Nu uitați de expresiile regulate!

10 November 2008

Cred că dacă m-ar întreba un boboc de la informatică ce ar trebui să învețe, i-aș recomanda, printre primele lucruri, să învețe despre expresii regulate. Pentru că ai nevoie de ele aproape peste tot și totuși se insistă atât de puțin asupra studierii lor. Sunt funcții care fac te miri ce procesare de text în te miri câte linii de cod (cu bug-urile aferente) care pot fi reformulate cu o simplă expresie regulată.

Am dat astăzi pentru o funcție care să extragă ultimele n extensii ale unui fișier. Pentru exemplu.cu.trei.extensii, dacă se dorea extragerea ultimelor două extensii, rezultatul era .trei.extensii. Dacă fișierul nu avea nicio extensie, nu trebuia întors nimic. Simplu, nu? Să vezi funcție scrisă (în C#) cu IndexOf(”.”), cu un șir de caractere la care se tot adună extensii și te miri ce verificări pentru cazuri speciale. Vreo 15 linii de cod pentru asta.

Cum se face cu expresii regulate? Păi în primul rând extensiile au forma .extensie deci trebuie căutat ”.” și orice alt caracter de oricâte ori. Asta înseamnă \.[^\.]* – punct este un caracter special, deci trebuie folosit escape character-ul ”\”. [ ] este o clasă de caractere. ^ neagă clasa de caractere, deci orice în afară de ce este conținut între [ ]. * înseamnă de zero sau mai multe ori. Dacă este nevoie ca  ceva să se repete de un număr fix de ori, se folosește {i} unde i e numărul de repetiții dorit. Deci pentru 3 extensii, {3}. Și pentru a face matching-ul la capătul care trebuie – ultimele n extensii, nu primele – se folosește $ la capătul expresiei, pentru a o lega de capătul textului.

Pe scurt, în C# se poate înlocui o funcție ca cea despre care vorbeam la început, cu următoarea linie de cod:

Regex.Match(input, @"(\.[^\.]*){" + i + "}$") unde input este numele fișierului și i este numărul de extensii dorit.

Dacă susții că te pricepi cât de cât la programare și trebuie să cauți sau să extragi sau să validezi sau să înlocuiești sau să faci ceva, orice cu un șir de caractere sau un text, primul lucru la care trebuie să te gândești este cum faci asta cu expresii regulate. Primul lucru. Cel mai probabil că ceea ce încerci să faci cu o combinație de IndexOf, Split, Trim etc., băgate și într-un loop pe deasupra, poți face cu o singură linie care conține un Regex.Match. Trust me!

From → code complete

Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: