Regularni izrazi
Regularni izrazi (regex) su specijalni tekstualni stringovi koji opisuju šablon za pretragu. Omogućavaju efikasnu pretragu, validaciju i ekstrakciju podataka iz tekstualnih izvora.
Šta su regularni izrazi?
Regularni izrazi su specijalni tekstualni stringovi koji opisuju šablon za pretragu. Oni predstavljaju moćan i fleksibilan način da se definišu obrasci u tekstu, koji se mogu koristiti za pronalaženje, validaciju ili zamenu podataka. Regex može biti posmatran kao unapređena verzija wildcard karaktera, ali sa mnogo većom preciznošću i mogućnostima.
- Koriste se za pretragu tekstualnih fajlova, validaciju korisničkog unosa, parsiranje podataka i još mnogo toga.
- Podržani su u gotovo svim modernim programskim jezicima i alatima za obradu teksta.
- Omogućavaju da se složeni obrasci opišu u jednoj liniji koda, što štedi vreme i smanjuje greške.
Regex je skraćenica za regularni izraz, odnosno šablon koji opisuje određeni segment teksta.
Zašto su regex korisni?
- Omogućavaju da se složena pravila opišu u jednoj liniji koda.
- Štede vreme i smanjuju količinu koda potrebnog za obradu teksta.
- Koriste se za validaciju ulaza, ekstrakciju podataka i zamenu teksta.
- Prisutni su u većini programskih jezika (Java, Python, PHP, JavaScript, .NET).
- Koriste se u tekst editorima i alatima za pretragu i zamenu.
- Popularni su u komandnim alatima poput grep, sed i awk.
Regex za email adresu
- Početak granice reči
\bosigurava da se poklapa cela email adresa. - Prvi deo opisuje korisničko ime (slova, cifre, tačke, donje crte, znakove +, - i %).
- Zatim sledi znak
@. - Drugi deo opisuje domen (slova, cifre, tačke i crtice).
- Na kraju je ekstenzija domena od 2 do 4 slova.
Validacija email adrese u Javi
Izlaz programa
- Regex se može koristiti za proveru formata unosa.
- Efikasno odvaja validne od nevalidnih primera.
Pronalaženje svih email adresa u tekstu
Izlaz pronalaženja email adresa
Može se koristiti i Pattern.CASE_INSENSITIVE kada ne želimo da razlikujemo velika i mala slova.
Terminologija
- Regex = regularni izraz
- Match = poklapanje
- String = ulazni tekst
- Regex engine = mehanizam za obradu regex-a
Poklapanje označava deo teksta koji odgovara zadatom obrascu.
Literali
- a poklapa prvo pojavljivanje znaka a
- cat traži sekvencu c-a-t
- Regexcatpoklapa "cat" u tekstu: "About cats and dogs"
- Regex je podrazumevano case-sensitive
Specijalni karakteri
Ako ih želimo koristiti kao obične karaktere, moramo ih escape-ovati znakom \.
Karakteri koji se ne prikazuju
- Windows završava red sa \r\n
- Linux koristi \n
Kako radi regex engine?
Leftmost Match First
- Prvo poklapanje sa leve strane biće vraćeno.
- Kasnije „bolje” poklapanje se ne traži.
- Engine kreće od početka stringa.
- Pokušava sve opcije na trenutnoj poziciji.
- Ako ne uspe, pomera se na sledeći karakter.
Primer rada regex engine-a
Prvo uspešno poklapanje je cat u reči catfish, jer regex engine vraća najlevlje poklapanje.
Klase karaktera
- Klasa karaktera poklapa tačno jedan karakter.
- Redosled karaktera u klasi nije važan.
Korisne primene klasa karaktera
Invertovane klase karaktera
- [^0-9] poklapa sve osim cifre.
- q[^u] znači q pa karakter koji nije u.
Metakarakteri unutar klasa karaktera
Skraćeno označavanje klasa karaktera
Invertovano skraćeno označavanje
Prvi izraz praktično poklapa bilo koji karakter, dok drugi isključuje cifre i whitespace.
Ponavljanje klasa karaktera
- [0-9]+ poklapa niz cifara.
- ([0-9])\1+ poklapa isti karakter više puta, npr. 222.
Tačka poklapa (skoro) sve karaktere
Tačka poklapa bilo koji karakter osim newline karaktera.
Koristite tačku pažljivo
Poklopiće i 02512703, što nije ono što želimo.
Bolji regex za datum
I dalje nije savršeno, ali je bolje od korišćenja tačke. Regex preciznije definiše dozvoljene separatore i opseg dana i meseca.
Koristite invertovanu klasu karaktera umesto tačke
Regex sa tačkom i zvezdicom je pohlepan i može poklopiti previše teksta. Korišćenjem invertovane klase karaktera ograničavamo poklapanje samo na željene karaktere. Na tekstu "Houston" we have a "problem" ovaj regex će poklopiti upravo to: "Houston" we have a "problem", umesto pojedinačnih navodnika.
Markeri za početak i kraj stringa
Primer validacije celobrojnog podatka
- početak stringa
- jedna ili više cifara
- kraj stringa
- Poklapa: 123
- Poklapa: 987654
- Ne poklapa:: 123a
- Ne poklapa:: a123
Korišćenje ^ i $ za linije
U multiline režimu, ^ i $ mogu označavati početak i kraj svake linije, a ne samo celog stringa.
Poklapanje nulte dužine
Ovaj regex prihvata i prazan string, jer * dozvoljava nula ponavljanja.
Granica reči
Invertovana granica reči
Poklapa pozicije koje nisu granice reči.
Kako radi granica reči?
Regex poklapa samo samostalnu reč is, a ne deo reči This.
Korišćenje vertikalne crte za alternativni izbor
Redosled alternativnih izbora je važan
Opciona polja
Važan koncept: pohlepnost
Regex će pokušati da poklopi i opcionu grupu ako je to moguće.
Kako radi regex colou?r?
Regex će preskočiti slovo u kada ono ne postoji, i uspešno poklopiti color.
Ponavljanje sa znakovima * i +
Ograničavajuće ponavljanje
Oprez na pohlepnost!
Poklapanje će biti <EM>first</EM>, što je pogrešno.
Lenjost umesto pohlepnosti
Poklapa minimalan broj karaktera (npr. samo <EM>).
Alternativa za nevoljnost
Efikasnije, bez nepotrebnog backtracking-a.
() za grupisanje
Obične zagrade grupišu delove regex-a za primenu operatora.
Obične zagrade kreiraju reference
Reference u praksi
Reference i ponavljanje
Primer
Zamena duplih reči u Javi
Dodatni praktični primeri
Zaključak
Regex je nezaobilazan alat za svakog softverskog inženjera.
- Tačan, čitljiv i efikasan regex je cilj.
- Vežba je najbolji način za savladavanje.
- Pitanja?
Uvek testirajte svoje izraze na realnim podacima.