Regularni izrazi

(1. deo vežbi)

citat: U računarstvu i informatici, regularni izraz (još i pravilni izraz, ispravni izraz[1] – često i engleske skraćenice regexp ili regex, u množini regexps, regexes ili regexen) je niz znakova koji opisuje druge nizove znakova (engl. string), u skladu s određenim sintaksnim pravilima. Prvenstvena svrha regularnog izraza je opisivanje uzorka za pretraživanje nizova znakova. (https://hr.wikipedia.org/wiki/Regularni_izraz)

Drugim rečima, regularni izraz je izraz kojim se definiše šablon koji se koristi za pretraživanje teksta (tekstualni šablon). Tekstualni šablon je takođe neki tekst, ali tako "skrojen" da u stvari opisuje u šta bi tekst trebao da se uklopi.

Nešto slično ste videli prilikom rada sa MySQL-om: kada ste koristili izraze za traženje tipa imeNecega LIKE "A%" (tražimo sve gde imeNecega počinje sa A)

Regularni izraz se koristi za proveru da li neki string odgovara šablonu (obrascu) ili ne. Obrazac se može sastojati od literala, brojeva, znakova, operatora ili složenijih konstrukcija. Obrazac se može koristiti za pretraživanje stringova ili fajlova kako bi se videlo da li su pronađena podudaranja. Regularni izrazi se često koriste u proverama unosa, obradi i pronalaženju stringova. Na primer, provera da li je ispravno napisan datum rođenja, matični broj, puno ime ako su ime i prezime odvojeni zarezom, pronalaženje broja pojavljivanja podstringa, zamena podstringa, format unosa datuma, format unosa e-maila, i tako dalje.

Da ponovimo: regularni izrazi se primenjuju na nizove znakova, a veoma često se nizom znakova smatra čitav tekstualni dokument.
Sastoje se od dve vrste znakova:
    • LITERALA  (znak ili sekvenca znakova koji se traže) i
    • METAZNAKOVA (služe kao komanda za rasčlanjivanje):  ^ $ . | { } [ ] egg * + ? \.

*

Neki od često korišćenih regularnih izraza:
Izraz Opis
. Bilo koji jedan karakter
^ Označava početak unosa
$ Označava kraj unosa
[ ] Bilo koji karakter koji se nalazi u uglastim zagradama. Na primer [abc] pronalazi a, b i c, ali ne i ostale karaktere.
[ - ] Bilo koji karakter koji se nalazi u uglastim zagradama izmeđnavedena dva karaktera. Na primer [a-c] pronalazi a, b i c, ali ne i ostale karaktere.
[^ ] Bilo koji karakter osim onih koji se nalaze u uglastim zagradama. Na primer [^abc] pronalazi sve karaktere osim a, b i c.
*  0 ili više puta prethodni karakter. Na primer bo* će pronaći b, bo i boo.
+ jedan ili više puta prethodno navedeni karakter. Na primer bo* će pronaći bo i boo, ali neće b.
? ni jedan ili jedan prethodno navedeni karakter. Na primer bo? će pronaći b i bo, ali neće boo.
{n} gde je n broj, pronalazi prethodno navedeni karakter koji se pojavljuje tačno n puta. Na primer o{2} pronalazi tačno oo.
{n,} gde je n broj, pronalazi prethodno navedeni karakter koji se pojavljuje najmanje n puta. Na primer o{2,} pronalazi oo, ooo, oooo, itd.
{n,m} gde su n i m brojevi, pronalazi prethodno navedeni karakter koji se pojavljuje najmanje n, a najviše m puta. Na primer o{2,3} pronalazi oo i ooo.
egg Pronalazi bilo koju sekvencu unutar zagrada. Na primer (ab)+ pronalazi ab, abab, ababab. Zagrade nam služe za grupisanje karaktera, tako da kvantifikatori '*', '+', '?' i {} na njih gledaju kao na jedan znak.
| Logički ILI operator. Na primer prvo|drugo pronalazi prvo ili drugo, dok R(1|2) pronalazi R1 ili R2.
\ Obrnuta kosa crta tretira specijalne karaktere literalno. Na primer znak + označava pronađi prethodni znak jednom ili više puta, dok \+ pronalazi baš +.
\n Pronalazi znak kraja linije.
\t Pronalazi tabulator.


U nastavku su prikazani neki primeri regularnih izraza, sa opisom njihovog značenja:

Izraz Značenje
\d
jedna cifra negde u unosu
a
karakter a negde u unosu
Aca
reč Aca negde u unosu
^Aca
reč Aca na početku unosa
Aca$ reč Aca na kraju unosa
^\d{2}$ tačno dve cifre
^[0-9]{2}$
tačno dve cifre
^[A-Z]{4,}$ najmanje 4 velika slova (samo u skupu ASCII karaktera)
^[A-Za-z]{4,}$ najmanje 4 velika ili mala slova (samo u skupu ASCII karaktera)
^[A-Z]{3}$^\d{2}$ tri velika slova u skupu ASCII karaktera i dve cifre
^[A-Za-z\u00c0-\u017e]+$ najmanje jedno veliko ili malo slovo u skupu ASCII karaktera ili evropska slova u unicode skupu karaktera
^d.g$ slovo d, zatim bilo koji karakter, a zatim slovo g, tako da može da se podudara u sa dug i sa dyg, odnosno, može se dodati bilo koji karakter između d i g
^d\.g$ slovo d, pa tačka (.), a zatim slovo g, tako da se podudara samo sa d.g


Dobra praksa: Upotrebite regularne izraze za validaciju unosa korisnika. Isti regularni izrazi mogu da se upotrebe ponovo u drugim jezicima, kao što je JavaScript.

...
U nastavku je link gde su na jednoj strani prikazani (u .Net-u) najčešće korišćeni elementi regularnih izraza :

...

Primer regularnog izraza je dat u nastavku:
   ^(From|To|Subject|Date):

Ovaj izraz odgovara svakom podskupu sa rečima “From”, “To”, “Subject”, “Date” ako su na početku novog reda (^), a završavaju se dvotačkom (smile.

Primer: Šta označava sledeći regularni izraz: ^[0-9]+\s+([a-zA-z]+|[a-zA-z]+\s+[a-zA-z]+)$?

Odgovor:
Značenje regularnog izraza je sledeće:
   • [0-9]+ znači da string počinje sa jednom ili više cifara,
   • \s+ cifre su praćene jednom ili više praznina,
   • ([a-zA-Z]+|[a-zA-Z]+\s+[a-zA-Z]+) znači da sledeća reč počinje sa jednim ili više znakova bilo velikih ili malih slova, a da to nije broj ili može početi sa jednim ili više znakova praćenih prazninom ili sa jednim ili više znakova,
• operator ili označava se uspravnom crtom ( | )
Primer: 11000 Beograd

...
Za proveru (i vežbu) da li su regularni izrazi koje kreirate ok, postoje aplikacije kao i online alati. Jedan od njih je:

...



Klase imenskog prostora RegularExpressions

(2. deo vežbi)

U .Net-u je razvijena sintaksa regularnih izraza, u imenskom prostoru System.Text.RegularExpressions.

  • Ako vas interesuje, na Microsoftovom web sajtu možete pogledati njihovo objašnjenje kada se i kako radi sa regularnim izrazima:  (LINK) .NET regular expressions

Klasa koju ćemo koristiti iz ovog prostora imena je:

Regex klasa

Regex je klasa u imenskom prostoru System.Text.RegularExpressions. Sadrži statičke metode koje dozvoljavaju korišćenje regularnih izraza bez eksplicitne izrade Regex objekta. Najpoznatija statička metoda klase Regex jeste Match, koja pretražuje ulazni string radi provere da li se javlja određeni regularni izraz i vraća traženi rezultat u obliku pojedinačnog Match objekta.

  • Na Microsoftovom web sajtu možete pogledati  (LINK) Regex Class (odaberite verziju koju vi koristite, ako želite).

Metode klase Regex omogućavaju izvršenje raznih operacija, od kojih su neke:

    • Utvrđivanje da li se regularni obrazac izraza pojavljuje u ulaznom tekstu pozivanjem metode Regex.IsMatch.
    • Utvrđuje jednu ili sve pojave teksta koji odgovaraju obrascu regularnog izraza pozivanjem Regex.Match ili Regex.Matches metode.
    • Zamena teksta koji odgovara obrascu regularnog izraza pozivanjem metode Regex.Replace.

Zadatak:

1. Kreirati aplikaciju. Na početak importovati imenski prostor: using namespace System.Text.RegularExpressions;

2. Postaviti u aplikaciju zahtev da korisnik unese svoje godine a pomoću regularnih izraza proveriti da li je unos validan.

( Ovaj zadatak se može raditi u konzolnoj / winForm / webForm aplikaciji, po izboru. )

Upotrebiti promenljivu za unos podataka: string input

programski kod:

   var ageChecker = new Regex(@"\d");
 if (ageChecker.IsMatch(input))
  {
    // ispisati poruku tipa "Hvala"
  } else
  {
    // ispisati poruku da nije validen unos
    // WriteLine($"Nisu ispravno unesene godine: {input}");
  }
 

Karakter @ isključuje mogućnost unosa karaktera izlazne sekvence u promenljivu tipa string. Karakteri izlazne sekvence imaju prefiks obrnute kose crte \ (\t je tab, \n je novi red).
Kada pišete regularne izraze, treba da isključite ovu funkciju (neka obrnuta kosa crta bude samo obrnuta kosa crta).
Kada su karakteri izlazne sekvence isključeni pomoću simbola @, regularni izraz može da ih interpretira kako treba. Na primer, \d označava cifru. U dalje detalje zasad ne ulazimo.

3. Pokrenite aplikaciju i unesite neki broj. Šta dobijate kao poruku?

Zatim pokušajte da unesete reč "aloooo". Šta se sada dobija kao poruka?

Zatim pokušajte da unesete reč "pera33detlić". Šta se sada dobija kao poruka?
Regularni izraz koji je upotrebljen je \d, što podrazimeva jednu cifru. Međutim, ne specificira šta može da bude uneto ispred i iza te jedne cifre.
Ovaj regularni izraz može da se opiše kao "Unesite bilo koje karaktere koje žalite, sve dok unosite najmanje jedan karakter koji je cifra".

4. Promenite regularni izraz na ^\d$, kao što je prikazano u sledećem kodu: var ageChecker = new Regex(@"^\d$"); 

5. Ponovo pokrenite aplikaciju. Sada aplikacija odbija sve, sem ako se unese jedna cifra.
   Ako želite da omogućite jednu ili više cifara, dodajte + iza \d izraza, da biste modifikovali značenje na jedan ili više.

6. Promenite regularni izraz, kao što je prikazano u kodu:  var ageChecker = new Regex(@"^\d+$");

7. Pokrenite aplikaciju i vidite kako regularni izraz sada omogućava samo nulu ili pozitivne cele brojeve bilo koje dužine.


Kontrola unosa tekstualnih podataka

(3. deo vežbi)

Primer: Kontrola unosa ispravne email adrese:


Primer 2:


Primer 3 (opciono umesto primera 2):

Last modified: Monday, 17 January 2022, 3:53 PM