30.01. Regularni izrazi (Regular Expressions)
UVOD: Šta su regularni izrazi?
Regularni izrazi (engl. Regular Expressions, skraćeno regex) su specijalni obrasci koji se koriste za pretragu, proveru i manipulaciju teksta. Možete ih zamisliti kao „pametniji“ način pretraživanja teksta, gde se mogu postaviti pravila kako treba da izgleda ono što se traži.
Možete ih posmatrati i kao šablone koji pomažu računarima da pronađu, provere ili zamene delove teksta prema nekim unapred postavljenim pravilima.
Regularnim izrazom se zadaje obrazac (engl. pattern) koji tražimo u tekstu, a pronađeni odgovarajući tekst se naziva poklapanje (engl. match). Kažemo da se dati obrazac poklapa sa određenim tekstom, a sam postupak traženja (engl. pattern matching) možemo približno da prevedemo kao uklapanje (teksta) u obrazac.
Primeri iz svakodnevnog života:
- Kada unosimo e-mail adresu na nekom sajtu, sistem proverava da li ona sadrži "@" i tačku na pravom mestu – to se može uraditi pomoću regularnih izraza.
- Ako se traže svi telefonski brojevi u nekom tekstu, regularni izrazi mogu da pronađu samo one koji imaju ispravan format.
- Kada se u nekom programu koristi opcija "Find and Replace", regularni izrazi mogu pomoći da se pronađu sve pojave određene reči, čak i ako su napisane različitim stilovima (npr. „pas“, „pAs“, „PAS“).
Kako izgledaju regularni izrazi?
Recimo da treba da se pronađu svi brojevi u tekstu. Umesto da se piše gomila koda, može se koristiti izraz "\d+"
- \d znači „bilo koji broj“ (0-9),
- + znači „jedan ili više ponavljanja“.
Ako treba pronaći sve reči koje počinju slovom "P", može se koristiti "\bP\w+"
- \b označava početak reči,
- P znači da mora početi slovom P,
- \w+ označava „bilo koja slova posle P“.
LINKOVI za dalji rad na času (ONLINE alati)
U nastavku ćemo isprobavati različite regularne izraze. Isprobaćemo različite varijante za primere koji slede. Koristićemo jednu od online platformi:
Struktura regularnih izraza
Regularni izrazi koriste kombinaciju:
- Običnih znakova: Slova, brojevi i drugi karakteri koji se doslovno prepoznaju.
- Specijalnih znakova: Znakovi sa posebnim značenjem, poput
.(bilo koji znak) ili*(nula ili više ponavljanja).
Neki od specijalnih znakova su:
[]- uglaste zagrade.- tačka^- karet (kvačica)$- dolar*- zvezda+- plus?- upitnik{}- vitičaste zagrade()- male zagrade|- alternacija (uspravna linija)
[ ] - Uglaste zagrade - se koriste da označe skup karaktera sa kojima se želi poklopiti. Pogledaj PRIMER
Na primer, ako je regularni izraz [abc] sa njim se podudara bilo koji string koji sadrži bilo a, b, ili c.
Proverimo da li se sledeći primeri stringova podudaraju sa ovim šablonom
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| a | 1 poklapanje | string sadrži jedno slovo a |
| car | 2 poklapanja | string sadrži a i c |
| jelo | 0 poklapanja | string ne sadrži ni a, ni b, ni c |
| abc | 3 poklapanja | string sadrži sva tri - a, b i
c |
Napomena: Može se navesti i opseg znakova koristeći znak - (minus) unutar uglastih zagrada.
Na primer,
[a-e]označava isto što i[abcde][0-3]označava isto što i[0123]
Napomena:
Ako skup karaktera unutar uglastih zagrada započnemo kvačicom ^, onda definišemo negaciju, odnosno "kažemo" da treba pronaći svaki znak koji nije naveden unutar uglastih zagrada.
. - Tačka - specificira bilo koji pojedinačni karakter (osim novog reda '\n'). Pogledaj PRIMER
Na primer, ako je regularni izraz …
(tri tačke za redom), on se poklapa sa stringovima koji sadrže tri karaktera.
Provera da li se sledeći primeri stringova podudaraju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| car | 1 poklapanje | string sadrži tri slova ( a, b, s) |
| i | 0 poklapanja | string ne sadrži tri slova |
| pas | 1 poklapanje | string sadrži tri slova |
| abcd | 1 poklapanje | string sadrži tri slova |
| abcjkl | 2 poklapanja | string sadrži 6 slova ( 3+3 ) |
^ - Caret (kvačica) - označava da string počinje određenim znakom. Pogledaj PRIMER
Na primer, ako je regularni izraz ^m
sa njim se poklapa bilo koji string koji počinje slovom "m"
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| maca | 1 poklapanje | maca počinje sa "m" |
| m | 1 poklapanje | m počinje sa "m" |
| Miloš | 0 poklapanja | Miloš ne počinje sa "m" |
| sms | 0 poklapanja | sms ne počinje sa "m" |
$ - znak za dolar - specificira string koji se završava sa određenim znakom. Pogledaj PRIMER
Na primer, ako je regularni izraz k$
sa njim se poklapa bilo koji string koji se završava slovom "k"
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| ponedeljak | 1 poklapanje | ponedeljak se završava sa "y" |
| sok | 1 poklapanje | sok se završava sa "k" |
| papagaj | 0 poklapanja | papagaj se ne završava sa"y" |
* - Zvezdica - se poklapa sa nula ili više pojavljivanja šablona. Pogledaj PRIMER
Na primer, ako je regularni izraz sa*t
sa njim se poklapa string koji ima bilo koji broj slova a između slova s i t
[uključujući nulu, tj da se ni ne pojavljuje].
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| sat | 1 poklapanje | sat ima jedno slovo a između s i t |
| st | 1 poklapanje | st ima nula pojavljivanja slova a
između s i t |
| saaaat | 1 poklapanje | saaaat ima tri slova a između s i t |
| set | 0 poklapanja | setima slovo e (ne a) između s i t |
| satsaat | 2 poklapanja | satsaat ima a na dva mesta ( sat i saat) |
+ - Plus znak - odgovara jednom ili više pojavljivanja navedenog šablona. Pogledaj PRIMER
Na primer, ako je regularni izraz sa+t
sa njim se poklapa string koji ima ima jedno ili više slova a između s i t
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| sat | 1 poklapanje | satima jedno slovo a između s
i t |
| st | 0 poklapanja | st nema ni jedno slovo a između s i t |
| satisaat | 2 poklapanja | satisaat ima dva odgovarajuća podstringa ( sat i saat) |
| salt | 0 poklapanja | a nije ispred slova t u reči salt |
? - Upitnik - se poklapa sa nijednim ili jednim pojavljivanjem šablona. Pogledaj PRIMER
Na primer, ako je regularni izraz sa?t
sa njim se poklapa string koji ima ima nijedno ili jedno slovo a između slova s i t
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| sat | 1 poklapanje | sat ima jedno slovo a između s
i t |
| st | 1 poklapanje | st ima nula slova a između s
i t |
| saaaaaat | 0 poklapanja | saaaaat ima više od jednog slova a između s i t |
| pasat | 1 poklapanje | pasat ima jedno slovo a između s i t |
{} - vitičaste zagrade - se koriste za specificiranje opsega ponavljanja šablona. Pogledaj PRIMER
Na primer, ako je regularni izraz a{2,3}
sa njim se poklapa string u kojem ima najmanje 2, a najviše 3 slova a sa leve strane nekog slova.
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| abcdabc | 0 poklapanja | ima samo jedno a levo od nekog drugog karaktera |
| abcdaac | 1 poklapanje | abcdaac ima dva slova a levo od nekog drugog karaktera |
| aabc saaat | 2 poklapanja | aabc saaat ima grupe od dva i tri slova a
levo od nekog drugog karaktera |
| - uspravna linija (Alternation) (naći ćete ga sa shift+ž na engleskoj tastaturi) - koristi se kao operator or. Pogledaj PRIMER
Na primer, ako je regularni izraz a|b
sa njim se poklapa string koji ima ili a ili
b
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| cde | 0 poklapanja | string nema ni a ni b |
| car | 1 poklapanje | postoji slovo a u stringu |
| abcdacd | 3 poklapanja | string ima dva a i jedno b |
() - male zagrade - se koriste za grupisanje podšablona. Pogledaj PRIMER
Na primer, ako je regularni izraz
(a|b|c)xz sa njim se poklapa bilo koji string koji ima ili a ili b ili
c iza kojih sledi xz
Proverimo da li se sledeći primeri stringova poklapaju sa ovim šablonom:
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| baxz | 1 poklapanje | a ili b je praćeno sa xz |
| ba xz | 0 poklapanja | postoji razmak između ba i
xz |
| axz cabxz | 2 poklapanja | a je praćeno sa xz i b
je praćeno sa xz |
Specijalni skupovi karaktera (specijalne sekvence)
Neki od specijalnih skupova karaktera su navedeni u nastavku:
\A - Poklapa se ako su specificirani karakteri na početku stringa. Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \Asun .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| sunce | poklapa se | nstring počinje sa sun |
| zasun | Ne poklapa se | string ne počinje sa sun |
\b - Poklapa se ako su specificirani karakteri na početku ili na kraju reči. Pogledaj PRIMERE
Prvi primer: ako je regularni izraz \bras sa njim se poklapa bilo koji string koja ima ras na početku.
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \bras.
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| raspad | poklapa se | ras je na početku reči (raspad) |
| jedna rasa | poklapa se | ras je na početku reči (jedna rasa) |
| narastao | Ne poklapa se | Slovo n se nalazi na početku reči (narastao) |
Drugi primer: ako je regularni izraz rad\b sa njim se poklapa bilo koja reč u stringu koja ima rad na kraju.
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom rad\b .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| ide rad | poklapa se | rad je na kraju reči (ide rad) |
| zarad mira u kući | poklapa se | frad je na kraju riječi (zarad mira u
kući) |
| mala zarada | Ne poklapa se | nema rad na kraju reči |
\B - Poklapa se ako se specificirani karakteri ne nalaze na početku ili na kraju reči. Pogledaj PRIMERE
Na primer, ako je regularni izraz \Brad
sa njim se poklapa bilo koja reč u stringu koja nema rad na početku.
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| radnici | Ne poklapa se | string ima rad na početku reči |
| dobar rad | Ne poklapa se | string ima rad na početku reči |
| zarada | poklapa se | string nema rad na početku reči |
Drugi regex primer: ako je regularni izraz
rad\B sa njim se poklapa bilo koja reč u stringu koja nema rad na kraju
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| radnici | poklapa se | niz nema rad na kraju reči |
| dobar rad | Ne poklapa se | niz ima rad na kraju reči |
| zarada | poklapa se | niz nema rad na kraju reči |
\d - Poklapa se sa bilo kojom decimalnom cifrom. To je isto kao da se piše [0-9] Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \d .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| 12abc3 | 3 poklapanja | postoje tri decimalne cifre u stringu |
| programiranje | Ne poklapa se | u stringu nema decimalnih cifara |
\D - Poklapa se sa bilo kojom ne-decimalnom cifrom. To je isto kao da se piše ^[0-9]. Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \D .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| 12abc3 | 3 poklapanja | postoje tri karaktera koji nisu decimalne cifre ( a, b i c) |
| 1234 | Ne poklapa se | ne postoji nijedan karakter koji nije decimalna cifra |
\s - Poklapa se ako string sadrži bilo koji znak razmaka. To bi bilo kao da se piše [ \t\n\r\f\v] . Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \s .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| proba hora | 1 poklapanje | string sadrži jedan razmak |
| program | Nema poklapanja | string ne sadrži ni jedan razmak |
\S - Poklapa se ako string sadrži bilo koji znak koji nije razmak. To bi bilo kao da se piše [^ \t\n\r\f\v]. Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \S .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| a b | 2poklapanja | niz sadrži dva karaktera koji nisu razmaci (a i b) |
| Nema poklapanja | string ne sadrži karaktere koji nisu razmaci |
\w - Odgovara bilo kojem alfanumeričkom karakteru (slova, brojevi, _). To bi bilo kao da se piše [a-zA-Z0-9_] . Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \w .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| a2&": ;3 | 3 poklapanja | niz sadrži tri alfanumerička karaktera ( a, 2 i 3 ) |
| %"> ! | Nema poklapanja |
Napomena: Donja crta ( _ ) se takođe smatra alfanumeričkim karakterom.
\W - Odgovara bilo kojem nealfanumeričkom znaku. To bi bilo kao da se piše [^a-zA-Z0-9_] . Pogledaj PRIMER
Proverimo da li se sledeći primeri stringova poklapaju sa regex šablonom \W .
| String | Da li se poklapa (match) | Razlog |
|---|---|---|
| a2%c | 1 poklapanje | string sadrži jedan znak koji nije alfanumerički ( %) |
| kikiriki | Nema poklapanja | string ne sadrži znakove koji nisu alfanumerički |