nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 23.10.2020.

trejler_dokument Jezici: ----

trejler_teg_narandzasti Težina: 8/10

regularni izrazi
regex
operatori
pretraga
obrada teksta
niske
teorija
zanimljivosti

Povezani članci

Tutorijal - Regex - Kako pronaći unutrašnji sadržaj HTML elemenataTutorijal - Regex i JavaScript - Korišćenje regularnih izraza u programskim jezicimaKako napraviti dobru lozinkuUpotreba specijalnih znakova u HTML datotekamaOperacije sa bitovima u programskom jeziku COperacije sa tekstualnim datotekama u programskim jezicima C i PythonUvod u JavaScript i DOM (Document Object Model)Uvod u PythonŠablonske niske u programskim jezicimaASCII, UNICODE i UTF - Predstavljanje znakova na računarimaKako napraviti syntax highlighterIzbor prvog programskog jezika
Svi članci
Perl – The only language that looks the same before and after RSA encryption.
Keith Bostic

Regularni izrazi - napredna pretraga teksta

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

Uvod

Većina zadataka u vezi sa pretragom i izmenom teksta u editorima, može se obaviti na jednostavan način, pomoću osnovnih alata (koji omogućavaju da se uneti tekst iz polja za pretragu traži u otvorenoj datoteci ili svim otvorenim datotekama (odnosno svim datotekama u folderu/projektu)), međutim, osnovni mehanizmi pretrage (bez regularnih izraza) - nisu u stanju da prepoznaju tekstualne obrasce.

Regularni izraz * je posebno formatirana niska znakova koja omogućava prepoznavanje i/ili validaciju tekstualnih obrazaca, to jest (da pojasnimo dodatno): regularni izraz je posebno formatirana niska preko koje se definiše skup (konkretnih/"običnih") niski koje će biti pretraživane u ulaznom tekstu. **

Pojmovi 'pretraga' i 'prepoznavanje', čitaocima su svakako jasni (i poznati od ranije), a validacija podrazumeva proveru određene niske, pri čemu se obraća pažnja na to da li se niska poklapa sa traženim obrascem (tipičan primer: proveriti da li je email adresa, uneta npr. preko formulara, formatirana na propisan način).

Svi editori o kojima smo pisali u članku o editorima i uređivanju teksta podržavaju regularne izraze i (naravno), regularni izrazi su takođe podržani u svim popularnim programskim jezicima (preko različitih biblioteka).

* U literaturi (kako domaćoj, tako i stranoj), regularni izrazi su popularni i pod pozajmljenom skraćenicom regex (eng. "regular expression").

** .... naravno, pod uslovom da se takva niska koristi u programu koji prepoznaje/uvažava sintaksu regularnih izraza.

Kako se formiraju regularni izrazi

Za početak, verujemo da prvi susret sa tipičnim regularnim izrazom ....

		
[a-z\._]{2,}@([a-z]{2,}\.)+([a-z]{2,}){1}
		
	
Slika 1. - Primer regularnog izraza (iako sve deluje pomalo komplikovano na prvi pogled, regularni izrazi su velika pomoć u mnogim tekstualnim pretragama, i stoga je krajnje preporučljivo posvetiti im pažnju i dobro ih savladati).

.... ne može biti previše prijatan (ali, "eto", "bacili smo vas odmah u vatru"). :)

Neintuitivna gomila "kojekakvih" znakova ne deluje kao nešto što ima previše smisla, a popularna pošalica koja navodi da je za dobijanje regularnih izraza dovoljno pustiti mačku da šeta po tastaturi * - kao da je stvorena da se u ovom trenutku pojavi i objasni poreklo izraza koji smo prethodno videli.

* Nije dovoljno (ipak je "malo komplikovanije od toga"). :)

Međutim, ako ostavimo pošalice po strani, prilično smo ubeđeni da ćete, uz pažljivo čitanje članka pred vama i uloženi trud, uspeti da u potpunosti razumete: i prethodni izraz (a usput, naravno, i da saznate čemu zapravo služi), kao i sve druge regularne izraze sa kojima ćete se susretati (jer zaista nije previše teško). :)

Za početak (kako i dolikuje), razmotrićemo jednostavne primere, koji se jedva razlikuju od obične pretrage (ali videćemo da čak i najjednostavniji regularni izrazi omogućavaju sasvim zanimljive pretrage), nakon čega ćemo polako povećavati kompleksnost izraza sa svakim novim primerom (i u svemu se truditi da svaki regularni izraz sagledamo "sa svih strana").

Podešavanje editora

Preporučujemo da pokrenete editor teksta koji koristite i (uporedo sa čitanjem članka), isprobavate primere koje ćemo prikazivati (otvorite i prozor za pretragu i aktivirajte korišćenje regularnih izraza).

regex_01.png
Slika 2. - Opcije za aktiviranje regularnih izraza u programima: (1) Notepad++, (2) Atom Editor, (3) Visual Studio Code i (4) Sublime Text.

Pre svega, regularni izrazi omogućavaju da se pretraga obavlja na način koji je skoro isti kao i pretraga bez regularnih izraza (pretraga "znak-po-znak") - pod uslovom da se ne koriste znakovi kao što su (pre svih) tačka, apostrof i kosa crta, koji u regularnim izrazima imaju specijalnu namenu (a ima i drugih znakova specijalne namene, o čemu ćemo više govoriti u nastavku).

Napišite rečenicu u kojoj je (negde otprilike u sredini) navedeno Vaše ime i prezime, i potom unesite ime i prezime u polje za pretragu (u nekim editorima pronađena niska će automatski biti označena u prozoru sa otvorenom datotekom, dok je u drugim programima potrebno da se pretraga pokrene "ručno").

regex_02.png
Slika 3. - Ako se u polje za prepoznavanje regularnih izraza unese obična niska znakova, pretraga će funkcionisati na uobičajen način (znak-po-znak), ali, ima izuzetaka: neki od znakova (tačka, kosa crta i drugi), predstavljaju specijalne znakove u regex pretragama (više o tome u nastavku teksta).

Regularni izrazi su "osetljivi" na velika i mala slova ('po default-u'), ali, podešavanja u editorima često poništavaju navedenu karakteristiku, i stoga, da bismo mogli da se upoznamo sa regularnim izrazima u njihovom "prirodnom stanju", potrebno je podesiti opcije u editoru:

regex_03.png
Slika 4. - Uključivanje opcije "case sensitive/match case" u programima: (1) Notepad++, (2) Atom Editor, (3) Visual Studio Code i (4) Sublime Text.

Sada smo spremni.

Osnovni regularni izrazi i klase znakova

Prvi "pravi" regularni izraz koji ćemo prikazati, poslužiće za prepoznavanje različitih rodova prideva beli: beli, bela, belo (prva tri slova su ista (u sve tri reči), a poslednje slovo se menja).

Regularni izraz koji obuhvata sve niske koje je potrebno pretraživati, ima sledeći oblik:

		
bel[iao]
		
	
Slika 5. - Regularni izraz koji pronalazi različite rodove prideva beli.

Znakovi uneti u veliku zagradu tretiraju se kao zasebne pojave svakog znaka - u kombinaciji sa niskom koja prethodi.

Još preciznije: pretraga podrazumeva pronalaženje niske dužine 4, koja počinje sa "bel", posle čega se na 4. poziciji može pojaviti bilo koji od znakova iz velike zagrade ('i', 'a' ili 'o').

Kao što u matematici važi: a * (b + c + d) = (a * b) + (a * c) + (a * d), tako i regularni izraz, koji smo uzeli za primer, istovremeno traži (praktično) tri reči: "beli", "bela", "belo".

Dakle: preko regularnog izraza (baš kao što smo na početku definisali), opisan je skup konkretnih niski koje će biti tražene u tekstu.

Na ovom mestu (pre nego što nastavimo da se upoznajemo sa osnovnim 'tehnikalijama'), ukratko ćemo se osvrnuti i na pojavu delimičnih poklapanja.

Delimična poklapanja

Ako za trenutak zamislimo da u tekstu (koji se pretražuje) postoje reči kao što su "belilo", "belina" i sl, navedene reči se neće poklopiti sa obrascem pretrage, međutim, budući da se prva četiri znaka u obe reči poklapaju sa obrascem pretrage, do grešaka može doći ukoliko se regularni izraz koristi (npr), u nekom od programskih jezika, u okviru funkcija za zamenu ili uklanjanje delova niske.

Problem se rešava korišćenjem dodatne regex sintakse (sa kojom ćemo se uskoro upoznati), preko koje se preciziraju granice reči, tj. niski.

.... a što se tiče obične pretrage (otvorenog dokumenta u editoru teksta i sl), u praktičnom smislu, svaka pojava niske koja se poklapa sa obrascem pretrage, bilo da je u pitanju zasebna niska ili deo druge niske, biće označena (tj. podvučena, markirana bojom i sl).

Takođe, ako je cilj bio samo da što brže nađemo reči u kojima dolazi do poklapanja na početku, u konkretnom slučaju smo isti rezultat lakše mogli postići običnom pretragom niski "bel" ili "beli" (što naravno nije mehanizam za postizanje pravog poklapanja, ali, sasvim dobro dođe za 'brzinsko snalaženje').

Vraćamo se na glavnu temu ....

Klase znakova

Niska koja stoji u velikim zagradama (na ranije prikazan način), i označava da se na datom mestu može pojaviti bilo koji pojedinačni znak iz velike zagrade, nosi naziv klasa znakova.

Za najčešće korišćene klase znakova, predviđeni su i skraćeni načini zapisa:

		
.  - bilo koji znak
\d - bilo koji znak koji predstavlja cifru - [0-9]
\D - bilo koji znak koji NE predstavlja cifru - [^0-9]
\s - bilo koji whitespace znak (razmak, tab, prelazak u novi red)
\S - bilo koji znak koji NIJE whitespace
\w - bilo koji znak iz skupa znakova [a-zA-Z0-9_]
\W - bilo koji znak koji nije iz skupa znakova [a-zA-Z0-9_]
\b - početak ili kraj reči (eng. "boundary")
		
	
Slika 6. - Unapred definisane klase znakova ("prečice"), koje omogućavaju kraći zapis (navedene "prečice" mogu se koristiti i u kombinaciji sa klasama znakova koje sami definišemo).

Da pojasnimo dodatno: regularni izrazi sa slike ispod ....

		
slika_0\d\.jpg
\w\d
		
	

.... ekvivalentni su sledećim regularnim izrazima:

		
slika_0[0-9]\.jpg
// regex preko koga se mogu tražiti niske nalik na
// "slika_01.jpg", "slika_02.jpg" .... "slika_09.jpg"

[a-zA-Z0-9_][0-9]
// regex preko koga se mogu tražiti nazivi ćelija u
// programima za rad sa tabelama: "A1", "A2", "C6", "K9" i sl
// (zarad pojednostavljenja, smatraćemo da se u tekstu neće
// pojavljivati niske nalik na "_1" i sl)
		
	

U prvom regularnom izrazu, tačka koja se tiče zapisa ekstenzije (".jpg"), zapisuje se posle znaka '\', i (naravno), u pitanju je escape sekvenca preko koje se tačka - koja je inače specijalni znak u regularnim izrazima - prepoznaje kao običan znak.

Ugrađene klase znakova (tj. "prečice"), svakako dobro dođu, ali, ako određena situacija zahteva dodatnu preciznost - moramo biti precizniji.

Na primer, ako je potrebno osmisliti regex koji prepoznaje polja iz šahovske notacije, gornji izraz ("znak-cifra"), neće biti od pomoći (znamo da šahovska polja "M8", "Z6" i sl. ne postoje), i mnogo je pravilnije navesti raspon mogućih znakova:

		
[A-H][1-8]
		
	
Slika 7. - Regex koji prepoznaje polja iz šahovske notacije.

Sa pogodnostima upotrebe prečica za klase znakova, upoznaćemo se u budućim primerima, a da bismo se dalje upoznali sa klasama znakova koje korisnici mogu definisati samostalno (tj. da bismo se što bolje upoznali sa tim šta se može, a šta ne može postići preko osnovnih regularnih izraza), razmotrićemo još jedan jednostavan primer.

Dodatni primer upotrebe jednostavnih regularnih izraza

Početna postavka je sledeća: otvorena datoteka u kojoj je upisano svih sedam padežnih oblika imenice "Petar" ....

		
Petar
Petra
Petru
Petra
Petre
Petrom
Petru
		
	
Slika 8. - Padežni oblici imenice Petar, koje ćemo pronalaziti preko regularnih izraza.

.... a zadatak je: osmisliti regularni izraz koji pronalazi (tj. obuhvata), svih sedam reči, u celosti (naravno, uz uključenu podršku za prepoznavanje velikih i malih slova).

- Pokušaj #1:

		
Pet[ar]
		
	
Slika 9. - Regularni izraz koji prepoznaje prva četiri znaka svih padežnih oblika imenice Petar

Uviđamo odmah da program pronalazi (pod)niske dužine 4 u svim padežnim oblicima.

Znakovi 'a' i 'r' u velikoj zagradi (iako liče na nastavak, tj. 'završetak' nominativa), samo su nezavisni znakovi koji se kombinuju sa prethodećom niskom "Pet" (baš kao i u prvom primeru), što praktično znači da se odvijaju dve nezavisne pretrage: "Peta" i "Petr".

Međutim, regularni izraz za sada ne prepoznaje: svih sedam reči, u celosti.

Ukoliko dopunimo obrazac na sledeći način (pokušaj #2):

		
Pet[ar][raueo]
		
	
Slika 10. - Regularni izraz za pretragu padežnih oblika imenice Petar koji prepoznaje prvih pet znakova.

.... program će tražiti sva poklapanja dužine pet znakova: "Petar", "Petra", "Petru", "Petre" (što su potpuna poklapanja koja postoje u tekstu), "Petro" (što je delimično poklapanje, koje takođe postoji u tekstu), kao i niske "Petaa", "Petau", "Petae", "Petao", "Petrr" - koje u datoteci ne postoje.

Rekli bismo da se kod mnogih čitalaca u ovom trenutku (sasvim prirodno) može pojaviti pretpostavka da bi se sledećom dopunom (pokušaj #3) ....

		
Pet[ar][raueo][m]
		
	
Slika 11. - Regularni izraz za pretragu padežnih oblika imenice Petar koji (još uvek) ne prepoznaje sve oblike.

.... problem mogao rešiti, međutim, navedeni izraz (iako je ispravan sam po sebi) - zapravo će pronaći samo instrumental imenice Petar ("Petrom").

.... i doslovno neće biti nijednog drugog poklapanja.

Ukoliko u samom regularnom izrazu nije definisano da postoji mogućnost da se neki od znakova u velikim zagradama ne pojavi, smatra se da se svaki od četiri dela pretrage, mora pojaviti (što nije praktično, jer, u primeru koji razmatramo, samo jedan od padeža ima šest slova).

Problem se rešava upotrebom tzv. kvantifikatora.

Kvantifikatori - ?, + i *

Regex kvantifikatori su specijalni znakovi preko kojih se navodi broj ponavljanja određenog znaka ili klase znakova:

		
? - Klasa znakova pojavljuje se jednom ili nijednom
* - Klasa znakova pojavljuje se: nijednom, jednom, ili više puta
+ - Klasa znakova pojavljuje se jednom ili više puta
		
	
Slika 12. - Nekoliko osnovnih kvantifikatora u regularnim izrazima.

Shodno pravilima sa slike #12, u izraz koji smo prethodno definisali, možemo dodati kvantifikator ?.

		
Pet[ar][raueo][m]?
		
	
Slika 13. - Regularni izraz za pretragu padežnih oblika imenice Petar koji sada (uz kvantifikator ?, koji definiše da se znak "m" može pojaviti jednom, ili nijednom), prepoznaje sve padežne oblike.

Uz dodatak kvantifikatora ?, dozvoljeno je da se četvrti član pretrage (znak 'm'), pojavi jednom ili nijednom - što omogućava svih sedam poklapanja (to je to, samo jedan dodatni znak, ali - 'pravi').

Ukoliko bismo koristili znak *, poslednji član pretrage ("m"), mogao bi da se pojavi i više puta, ali - to nije dobar obrazac za pretragu u primeru koji razmatramo (proverite sami).

Na ovom mestu, primetićemo da regularni izraz koji smo koristili može (potencijalno) biti problematičan, budući da nije u stanju da "hirurški" izdvoji samo one niske koje smo zamislili (na primer, u stanju je da pronađe i nisku "Petao"). Međutim, nećemo širiti diskusiju, već ćemo prepustiti čitaocima da samostalno - za vežbu - osmisle optimalan algoritam (preko tehnika koje ćemo opisati u nastavku i u budućim člancima).

Pogledajmo još nekoliko jednostavnih regularnih izraza koji se daju formirati uz korišćenje do sada prikazanih opcija.

		
[0-9a-fA-F]             - Heksadekadna cifra
[0-9a-fA-F]+            - Heksadekadni broj (više ponavljanja bilo koje od
                          heksadekadnih cifara)
((0[xX])?[0-9a-fA-F])+  - Heksadekadni broj u programskom jeziku C
                          (i srodnim jezicima)
#[0-9a-fA-F]*           - Heksadekadni broj u CSS-u
[A-Za-z_][A-Za-z_0-9]*  - identifikator promenljive (ali - ovakav regex je
                          dobar samo za otkrivanje loše formatiranih
                          identifikatora; u većem tekstu,
                          izabraće većinu reči)
		
	
Slika 14. - Razni jednostavni regularni izrazi koje možete samostalno isprobati (nedostatke prikazanog regex-a za heksadekadni zapis brojeva, otklonićemo u nastavku).

U gornjim primerima postoji (očekivano) i jedan manji problem (koji predstavlja uvod u sledeći odeljak): iako se niska #33aaff prepoznaje, a niska #33nnff odbacuje, niska #33aaffaaff će takođe biti prepoznata - iako takva niska ne predstavlja heksadekadni zapis boje (koji inače podrazumeva šest cifara, ili osam, * u kom slučaju poslednje dve cifre označavaju Alfa kanal).

Naravno, i za ovakav problem postoji rešenje (s tim da ćemo do rešenja doći postepeno) ....

* Ovoga puta nećemo se obazirati na skraćene heksadekadne zapise boja u CSS-u (koji koriste 3 ili 4 cifre).

Takođe, ne smemo zaboraviti da regularni izrazi nisu - u opštem smislu - namenjeni pronalaženju "heksadekadnog zapisa cifara", "telefonskih brojeva" i sl, već samo mogu pronalaziti opšte tekstualne obrasce (iz čega praktično sledi da je naš zadatak, da udesimo da se opšti tekstualni obrasci, poklope sa konkretnim tekstualnim obrascima (koje pretražujemo)).

Operatori "{m, n}" i "|"

Ako sa odrednicom za jednu cifru (?), ne "zahvatamo" dovoljno veliki raspon, a uz odrednicu za proizvoljan broj cifara (*), nemamo 'kontrolu i preciznost', rešenje može biti upotreba kvantifikatora raspona {}, koji omogućava da se u vitičastim zagradama navede tačan ili približan broj ponavljanja.

Opšti princip objasnićemo preko primera (u kome važi: x = 3 i y = 5).

		
{x}   - Broj ponavljanja je x (3)
{y,}  - Broj ponavljanja je x (3) ili više
{x,y} - Broj ponavljanja je u rasponu od x do y (3, 4, ili 5)
		
	
Slika 15. - Kvantifikator raspona "{}" (uz opis tri moguća načina upotrebe).

Regularni izraz za pronalaženje heksadekadnih brojeva, potencijalno bi se mogao izvesti na sledeći način ....

		
#[0-9a-fA-F]{6}
		
	
Slika 16. - Regularni izraz za pronalaženje šestocifrenog heksadekadnog zapisa boja u CSS-u (izraz je skoro potpuno funkcionalan, ali, biće potrebno još malo doterivanja).

.... međutim, iako smo "na pravom tragu", ima još detalja oko kojih se moramo pobrinuti.

Hoćemo reći: regularni izraz za pretragu heksadekadnog zapisa boja - nije još uvek kompletan.

Izraz sa slike #16 traži (i pronalazi) sve niske koje počinju heštegom "#" posle koga sledi šest heksadekadnih cifara, i u pitanju je adekvatno rešenje za određene "neformalne" situacije, to jest, za tekstualne datoteke u kojima nema mnogo heksadekadnih brojeva, pri čemu znamo da je korišćen samo korektan šestocifreni hex zapis.

Ako je potrebno da budemo precizni, odnosno, ako je potrebno da se obuhvati i heksadekadni zapis boja sa osam cifara (poslednje dve cifre označavaju Alfa kanal), moramo "tražiti dalje" ....

Inače, sa regexom koji smo videli, moramo se dobro paziti (ukoliko heksadekadni zapis brojeva nije korektan) ....

Prikazani regularni izraz traži šestocifreni heksadekadni zapis boja (makar bi tako "trebalo da bude", iz perspektive korisnika), ali, ukoliko u tekstu postoje niske koje počinju "tarabom" (#), posle čega se pojavljuje šest ili više heksadekadnih cifara, navedeni regex će pronaći (praktično) početak svake od niski (posle čega: ima ili nema dodatnih cifara (tj. posle čega je zapravo svejedno da li ima ili nema dodatnih cifara)).

Ukratko, regex pronalazi samostalne niske dužine "1+6" (na primer, #82aa3a), ali i niske koje su delovi (većih) niski, koje se ne završavaju posle šeste cifre (na primer, početak niske #82aa3a1aeff32, koji je isti kao prethodna niska), pa možemo reći da navedeni regularni izraz u praktičnom smislu nije dovoljno precizan (u nastavku ćemo se upoznati sa opcijama koje omogućavaju da budemo precizni).

Ako pokušamo da pretragom obuhvatimo i osmocifreni zapis boja, preko sledećeg izraza:

		
#[0-9a-fA-F]{6,8}
		
	
Slika 17. - Regularni izraz za pronalaženje heksadekadnog zapisa boja u CSS, čija je dužina od 6 do 8 cifara (ali, budući da prikazani izraz neće pravilno odreagovati ukoliko se u tekstu pojavi zapis sa sedam cifara - koji je nepravilan - potrebno je u nastavku prepraviti izraz).

.... ponovo nećemo "dobro proći", jer, svaki put kada pronađe prvih šest cifara - program će praktično prestati da razmatra da li nakon šeste cifre ima i drugih cifara (isto kao u prethodnom primeru), i biće označeno samo prvih šest cifara - nakon čega je svejedno da li uopšte ima cifara posle šeste cifre, da li slede dve cifre, ili sledi manje ili više od dve cifre)!

Da bismo bili skroz sigurni da će regularni izraz tražiti heksadekadni zapis boja sa (tačno) 6 ili 8 cifara, potrebno je ispratiti sledeća uputstva:

  • umesto raspona, praktičnije je definisati dva zasebna regularna izraza
  • dva nezavisna regex-a treba spojiti preko operatora "|" (logičko ILI)
  • potrebno je koristiti i klasu znakova \b ("boundary" - krajevi reči)
		
#[0-9a-fA-F]{6}\b|#[0-9a-fA-F]{8}\b
		
	
Slika 18. - Prepravljani regularni izraz za pronalaženje heksadekadnog zapisa boja u CSS-u (uz malo "komplikacija", sada su uredno podržani: i šestocifreni zapis, i osmocifreni zapis (koji definiše i Alfa kanal)).

Regularni izraz sada predstavlja korektan obrazac pretrage, koji pronalazi: "niske koje počinju znakom '#' - posle čega sledi tačno šest ili osam znakova koji predstavljaju heksadekadne cifre - nakon čega se reč završava".

Bilo bi lepo da možemo napisati samo jedan izraz, to jest, bilo bi lepo da se logičko ILI može staviti u zagradu između 6 i 8, ali, regularni izrazi tako nešto ne dozvoljavaju.

U svemu navedenom (kao što i sami možete lako zaključiti), od presudne važnosti je upotreba klase znakova \b, jer - ukoliko se ne upotrebi navedena klasa znakova (kao "signal" da je potrebno uzeti u obzir granice reči) - programi koji izvršavaju regex pretragu će i dalje uzimati u obzir početne delove niski koje se ne završavaju posle šeste cifre!

Grupisanje delova izraza preko zagrada

Male zagrade mogu se koristiti za grupisanje celina unutar izraza (na primer):

		
1. (mono|motoci)kl
2. (#[0-9a-fA-F]{6}\b)?
		
	
Slika 19. - Jednostavni primeri upotrebe (malih) zagrada u regularnim izrazima.

Prvi izraz traži dve reči: "monokl" i "motocikl", dok drugi izraz traži heksadekadni zapis boje, koji se može (ali i ne mora) naći na određenom mestu.

Tipični primeri upotrebe regularnih izraza

Da bismo zaokružili uvodnu priču o regularnim izrazima, sagledaćemo detaljno nekoliko tipičnih primera (koji prikazuju kako različite tehnike koje smo do sada opisali 'sarađuju' u praksi).

Brojevi telefona

Ponešto pojednostavljen izraz koji vidimo ispod, može se iskoristiti za prepoznavanje brojeva telefona (sa pozivnim brojem za gradove ili mobilne mreže, ali, bez pozivnog broja za državu):

		
0[0-9]{2}[/-][0-9]{3,4}-?[0-9]{3,4}
		
	
Slika 20. - Regularni izraz za pronalaženje brojeva telefona (sa pozivnim brojem za grad, ali - bez pozivnog broja za državu).

Posmatrajmo izraz po delovima:

		
0            - Niska mora počinjati cifrom "0",
[0-9]{2}[/-] - sledeća dva znaka moraju biti cifre od 0 do 9,
               posle čega se mora pojaviti znak "/" ili znak "-",
[0-9]{3,4}   - Posle do sada navedenih znakova, mora se pojaviti 
               grupa od tri ili četiri cifre ....
-?           - ..... zatim znak "-", koji se može, ali i
               ne mora pojaviti,
[0-9]{3,4}   - ... i (na kraju), ponovo grupa od tri
               ili četiri cifre
		
	
Slika 21. - Dodatna objašnjenja u vezi sa regularnim izrazom za pronalaženje telefonskih brojeva.

Da li postoji mogućnost da se izraz pojednostavi upotrebom prečica za klase znakova?

Svakako da postoji:

		
0\d{2}[/-]\d{3,4}-?\d{3,4}
		
	
Slika 22. - Regularni izraz za pronalaženje brojeva telefona - pojednostavljen preko prečica za klase znakova.

Niska \d u regularnim izrazima predstavlja cifru, i stoga pojava navedene skraćenice ima isti efekat kao pojava klase znakova [0-9].

E-mail adrese

Regularni izraz za prepoznavanje e-mail adresa (sa kojim smo se "možda" već susreli :)), ima sledeći oblik:

		
[a-z\._]{2,}@([a-z]{2,}\.)+([a-z]{2,}){1}
		
	
Slika 23. - Regularni izraz za pronalaženje e-mail adresa.

Posmatrajmo izraz po delovima:

		
[a-z\._]{2,}   - regex prvo traži nisku znakova koja predstavlja
                 korisničko ime; niska mora imati dužinu najmanje
				 2 znaka i može se sastojati samo iz malih slova
			     alfabeta, tačaka i podvučenih crta (tačka, koja
                 je inače specijalni znak u regularnim izrazima,
			     navodi se preko escape sekvence "\.")
@              - posle korisničkog imena mora uslediti znak "@"
([a-z]{2,}\.)+ - celokupan domen, osim domena najvišeg nivoa
([a-z]{2,}){1} - domen najvišeg nivoa, "com", "rs" i sl (koji se
                 mora pojaviti tačno jedanput)
		
	
Slika 24. - Dodatna objašnjenja u vezi sa regularnim izrazom za pronalaženje e-mail adresa.

Na ovom mestu, možemo primetiti jednu krajnje 'zgodnu' stvar u regularnim izrazima: uz upotrebu zagrada, može se preciznije definisati dejstvo kvantifikatora, što ćemo razmotriti na primeru kvantifikatora {2, } i + koje smo koristili.

Kvantifikator {2,}, koji je u zagradi, odnosi se na klasu znakova [a-z], odnosno, određuje da se bilo koji od znakova klase [a-z] može pojaviti proizvoljan broj puta (pod uslovom da se pojavi grupa od bar dva znaka), posle čega mora uslediti tačka ([a-z]{2,}\.).

Kvantifikator + određuje da se celokupan izraz koji smo prethodno naveli u zagradi (tj. praktično, deo domena), * mora pojaviti jedanput, ali, može se pojaviti i više od jedanput.

* Regularni izraz [a-z]{2,}\., praktično definiše svaki deo domena (tj. deo naziva mail servera), osim poslednjeg dela (kao što je "com", "rs" i sl).

U pitanju su niske nalik na gmail. u adresi neko_ime@gmail.com i niske naziv_preduzeca. i co. u adresi neko_ime@naziv_preduzeca.co.rs.

Poslednji deo domena, to jest, domen najvišeg nivoa (com, rs i sl), pojavljuje se tačno jednom: ([a-z]{2,}){1}

Prepoznavanje HTML tagova

Prepoznavanje HTML tagova može se izvesti preko sledećeg obrasca pretrage:

		
<[a-z/\'\.= ]*>
		
	
Slika 25. - Regularni izraz za prepoznavanje HTML tagova.

Da pojasnimo:

  • niska počinje znakom <
  • nakon prvog znaka, znakovi od 'a' do 'z', znak '/', znaci navoda, tačka, znak jednakosti i praznina, pojavljuju se proizvoljan broj puta
  • niska se završava znakom >

(Regularni izraz prepoznaje: i "otvarajuće" tagove, sa ili bez atributa, i "zatvarajuće" tagove.)

Preko prikazanog izraza, izabrani tagovi se lako mogu izdvojiti zarad kopiranja, brisanja, izdvajanja sadržaja između tagova (malo komplikovaniji zahvat i tema za neku kasniju diskusiju), i sl.

Sledeći koraci ....

Tehnike koje smo predstavili u članku, nisu (naravno) "sve što se može reći" o regularnim izrazima, ali, ima sasvim dovoljno 'građe' za početak i već sada (uz korišćenje stečenog znanja i uz ponešto truda), sami možete kreirati regularne izraze koji će sasvim dobro poslužiti u svakodnevnom radu.

Iako se opcije mogu isprobavati u editorima koje inače upotrebljavate, preporučujemo i jedan koristan sajt ....

Regex 101

... koji u svemu može dodatno pomoći.

Uz dobro vladanje prečicama za rad sa tekstom (i ostalim naprednim opcijama u editorima) - i uz dobro poznavanje regularnih izraza - bićete u prilici da poslove unosa i obrade teksta u web dizajnu i programiranju, obavljate znatno jednostavnije i znatno efikasnije.

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2025. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > Regularni izrazi - napredna pretraga teksta
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2025. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt