Regularni izraz
1
Regularni izraz U ra€unarstvu i informatici, regularni izraz (jo• i pravilan izraz, -{regexp}}- ili izraz, ispravan izraz - engl. skr. -{regexp -{regex -{regex}-, }-, u mno‚ini -{regexps -{regexps}-, }-, -{regexes -{regexes}}- ili -{regexen -{regexen}-) }-) je string koji opisuje ili sparuje skup stringova, u skladu s odreƒenim sintaksnim pravilima. Regularne izraze koriste mnogi tekst procesori i pomo„ni programi za pretragu i manipulaciju teksta. Mnogi programski jezici podr‚avaju regularne izraze za manipulaciju stringovima. Na primer, -{Perl}- i -{Tcl}- imaju mo„an motor za regularne izraze ugraƒen direktno u sintaksu. Skup pomo„nih programa (uklju€uju„i ureƒiva€ -{sed}- i filter -{grep)}- koji se standardno distribuira sa juniks distribucijama je mnogo u€inio na promociji i popularizaciji koncepta regularnih izraza.
Osnovni koncepti Regularni izraz, €esto zvan uzorak ili patern, je izraz koji opisuje skup stringova. Uobi€ajeno se koriste za davanje konciznog opisa skupa, bez potrebe za nabrajanjem svih elemenata skupa. Na primer, skup koji sadr‚i sva tri stringa -{ Handel}-, -{ H€ndel}-, i -{ Haendel}- se mo‚e opisati uzorkom "-{H}-(-{…}-|-{ae}-?)-{ndel}-" (ili alternativno, ka‚e se da uzorak sparuje (engl. -{match}-) svaki od tri stringa. U ve„ini formalizama, ako postoji regex koji sparuje odreƒeni skup, tada postoji i beskona€an skup takvih izraza. Ve„ina formalizama pru‚a slede„e operacije prilikom konstrukcije regularnih izraza: alternacija Uspravna crta razdvaja alternative. Na primer "-{gray}-|-{grey}-" se mo‚e skratiti u istovjetan izraz "-{gr}-(-{a}-|-{e}-)-{y}-", i pri tome spariti -{gray}- ili -{grey}-. grupisanje Zagrade se koriste za definisanje podru€ja delovanja (engl. -{ scope}-) i prednosti operatora. Na primer, "-{gray}-|-{grey}-" i "-{gr}-(-{a}-|-{e}-)-{y}-" su razli€iti uzorci, ali oboje opisuju skup koji sadr‚i -{gray}ili -{grey}-. Kvantifikacija Kvantifikator nakon znaka ili skupa njih odreƒuje u€estalost pojavljivanja izraza koji prethodi. Naj€e•„e kori•„eni kvantifikatori su ?, *, i +: ? Upitnik ozna€ava da pojavljivanje prethodnog izraza nula puta ili jedanput. jedanput. Na primer, -{colou?r}sparuje i "-{color}-" i "-{colour}-". * Zvezdica (engl. -{asterisk }-) }-) ozna€ava pojavljivanje prethodnog izraza nula puta, jedanput ili bilo koji ve€i broj puta. Na primer, -{"go*gle"}- sparuje -{ ggle}-, -{gogle}-, -{google}-, -{gooogle}-, itd. + Znak plus ozna€ava pojavljivanje prethodnog izraza barem jednom. jednom. Na primer, -{"go+gle"}- sparuje -{gogle}-, -{google}-, -{gooogle}-, itd. (ali ne i -{ggle}-). Ove elementarne konstrukcije se mogu kombinovati u proizvoljno slo‚ene izraze, sli€no na€inu na koji se mogu konstruisati aritmeti€ki izrazi iz brojeva i operacija +, -, * i /. Stoga su "-{H}-(-{ae}-?|-{…}-)-{ndel}-" i "-{H}-(-{a}-|-{ae}-|-{…}-)-{ndel}-" ispravni uzorci, i •tavi•e, oba sparuju iste stringove ba• poput primera sa po€etka €lanka. Uzorak "((-{great}- )*-{grand}- )?((-{fa}-|-{mo}-)-{ther}-)" sparuje bilo koji od stringova koji u engleskom jeziku ozna€avaju pretke -{father}-, -{mother}-, -{grand father}-, -{grand mother}-, -{great grand father}-, -{great grand mother}-, -{great great grand father}-, -{great great grand mother}-, -{great great great grand father}-, -{great great great grand mother}- i tako dalje.
Regularni izraz
2
Precizna sintaksa regularnih izraza varira od alata do alata i podru€ja primene - vi•e detalja je dato u sekciji Sintaksa.
Istorija Poreklo regularnih izraza le‚i u teoriji automata i teoriji formalnih jezika, pri €emu su obe discipline teoretskog ra€unarstva. Ove discipline prou€avaju modele ra€unanja (automate) te na€ine opisa i klasifikacije formalnih jezika. Matemati€ar -{Stephen Kleene}- je 1950-ih opisao ove modele koriste„i matemati€ku notaciju nazvanu regularni skupovi. -{Ken Thompson}- je ugradio ovu notaciju u ureƒiva€ -{QED}-, a potom i u juniks editor -{ed}-, •to je s vremenom dovelo do upotrebe regularnih izraza u -{grep}--u. Otad se regularni izrazi na•iroko koriste u juniksu i juniksoidnim pomo„nim programima kao •to su -{expr}-, -{awk}-, -{Emacs}-, -{vi}-, -{lex}- i -{Perl}-. -{Perl}- i -{Tcl}- regularni izrazi su izvedeni iz regex biblioteke koju je napisao -{Henry Spencer}-, iako je -{Perl}kasnije pro•irio -{Spencer}--ovu regex biblioteku i dodao mnogo novih svojstava. [1] -{Philip Hazel}- je razvio -{PCRE}- (-{ Perl Compatible Regular Expressions}-) koji jako dobro opona•a funkcionalnost regularnih izraza u -{Perl}--u, i kojeg koriste mnogi moderni programski alati kao •to su -{PHP}-, -{ColdFusion}-, i -{Apache}-. Deo napora ulo‚enog u dizajn -{-{Perla}- 6}- je ba• u smeru pobolj•anja integracije -{Perl}--ovih regularnih izraza, te pove„anju njihovog podru€ja delovanja u svrhu dozvole definicije tzv. -{ 'parsing expression grammar }- [2]'. Rezultat je mini-jezik nazvan -{Perl}- 6 pravila, koja se koriste kako za definiciju gramatike -{Perl}--a 6 tako i kao alat -{Perl}- programerima. Ova pravila €uvaju sva svojstva regularnih izraza, ali i dozvoljavaju definicije u BNF stilu parsera tehnikom rekurzivnog spusta preko potpravila. Kori•tenje regularnih izraza u struktuiranim informacionim standardima (za modeliranje dokumenata i baza podataka) se pokazalo vrlo va‚nim, po€ev•i od 1960-ih te se pro•iruju„i 1980-ih konsolidacijom industriskih standarda kao •to je -{ISO SGML}-. Jezgra standarda jezika specifikacije strukture su regularni izrazi. Jednostavnija i evidentnija upotreba je u grupnoj sintaksi -{DTD}--a.
Formalna teorija jezika Regularni izrazi mogu biti izra‚eni preko formalizma teorije formalnih jezika. Regularni se izrazi sastoje od konstanti i operatora koji ozna€avaju skupove stringova i operacija nad tim skupovima. Za datu abecedu , slede„e konstante su definisane: ‡ ( prazan skup) koji ozna€ava ‡ ( prazan string) koji ozna€ava skup ‡ (literalni karakter ) a u koji ozna€ava skup {a} te slede„e operacije: ‡ (nadovezivanje ili konkatenacija) -{RS}- ozna€ava skup { ˆ‰ | ˆ u -{R}- i ‰ u -{S}- }. Na primer {-{ab}-, -{c}-}{-{d}-, -{ef}-} = {-{abd}-, -{abef}-, -{cd}-, -{cef}-}. ‡ (alternacija) -{R}-|-{S}- ozna€ava uniju skupova -{R}- i -{S}-. ‡ ( Kleeneov operator ) R* ozna€ava najmanji nadskup od -{R}- koji sadr‚i i zatvoren je za nadovezivanje stringova. Ovo je skup svih stringova koji mogu biti na€injeni nadovezivanjem nula ili vi•e stringova u -{R}-. Na primer, {-{ab}-, -{c}-}* = {Š, -{ab}-, -{c}-, -{abab}-, -{abc}-, -{cab}-, -{cc}-, -{ababab}-, ... }. Gornje konstante i operatori oblikuju Kleeneovu algebru. Mnogi ud‚benici koriste simbole
, + ili
za alternaciju umesto vertikalne crte.
Da bi se izbeglo kori•tenje zagrada, pretpostavlja se da Kleeneov operator ima najve„u prednost, a potom slede nadovezivanje i na kraju unija skupova. Ukoliko ne postoji nejednozna€nost, zagrade se mogu odbaciti. Na primer, "(-{ab}-)-{c}-" se pi•e kao "-{abc}-" i "-{a}-|(-{b}-(-{c}-*))" mo‚e biti zapisano kao "-{a}-|-{bc}-*". Primeri: ‡ "-{a}-|-{b}-*" ozna€ava {Š, -{a}-, -{b}-, -{bb}-, -{bbb}-, ...}
Regularni izraz
3
‡ "(-{a}-|-{b}-)*" ozna€ava skup svih stringova koji se sastoje od bilo kog broja simbola -{a}- i -{b}-, uklju€uju„i prazan string ‡ "-{b}-*(-{a}-|-{b}-*)*" isto kao prethodni primer ‡ "-{ab}-*(-{c}-|Š)" ozna€ava skup svih stringova koji po€inju simbolom -{a}-, nakon kojeg sledi nula ili vi•e simbola -{b}- te kona€no opciono -{c}-. ‡ "(-{aa}-|-{ab}-(-{bb}-)*-{ba}-)*(-{b}-|-{ab}-(-{bb}-)*-{a}-)(-{a}-(-{bb}-)*-{a}-|(-{b}-|-{a}-(-{bb}-)*-{ba}-)(-{aa}-|-{ab}-(-{b "ozna€ava skup svih stringova koji sadr‚e paran broj simbola -{a}- i neparan broj simbola -{b}Formalna definicija regularnih izraza je s namerom •tura i izbegava definisanje zamenljivih kvantifikatora ? i +, koji pak mogu biti izra‚eni na slede„i na€in: -{a}-+ = -{aa}-*, i -{a}-? = (Š|-{a}-). Ponekad se dodaje operator komplementiranja ~, tako da ~ -{R}- ozna€ava skup svih stringova nad ‹* koji nisu u -{R}-. Operator komplementiranja je zamenljiv - uvek se mo‚e izraziti kori•tenjem drugih operatora (proces ra€unanja takvog predstavljanja je slo‚en, a rezultat mo‚e biti eksponencijalno ve„i, ali je ipak mogu„). Regularni izrazi u ovom smislu mogu izraziti ta€no klasu jezika koju prihvataju kona€ni automati - regularne jezike. Meƒutim, postoji zna€ajna razlika u kompaktnosti - neke klase regularnih jezika mogu biti opisane automatima koji rastu eksponencijalno u veli€ini, dok du‚ina zahtevanih regularnih izraza raste linearno. Regularni izrazi odgovaraju tre„em tipu gramatika hijerarhije Œomskog i mogu biti kori•teni za opis regularnog jezika. S druge strane, postoji jednostavno preslikavanje izmeƒu regularnih izraza i nedeterministi€kih kona€nih automata (NKA) koje ne vodi ka tolikom rastu veli€ine. To je glavni razlog kori•tenja NKA kao alternativnog na€ina predstavljanja regularnih izraza. Takoƒe se mo‚e prou€avati izra‚ajnu mo„ unutar formalizma. Kao •to primer pokazuje, razli€iti regularni izrazi izra‚avaju isti jezik - formalizam je zamenljiv. Mogu„e je napisati algoritam koji za dva data regularna izraza ispituje jednakost opisanih jezika, tako •to redukuje svaki izraz na minimalni deterministi€ki kona€ni automat i potom ispituje izomorfnost njihovih grafova dijagrama stanja. Do kog nivoa se ova zamenljivost mo‚e eliminisati? Mo‚e li se na„i zanimljiv podskup regularnih izraza koji je jo• uvek potpuno izra‚ajan? Kleeneov operator i unija skupova su o€igledno meƒu zahtevanim operacijama, ali mo‚da njihova upotreba mo‚e biti ograni€ena. Ovo se pokazalo kao za€uƒuju„e te‚ak problem. Koliko god jednostavni regularni izrazi bili, pokazalo se da ne postoji metoda njihovog sistematskog prepisivanja u neki normalni oblik. Oni nisu kona€no aksiomatizabilni, te stoga moramo pribe„i drugim metodama. Ovo vodi do problema visine zvezde.
Sintaksa Tradicionalni regularni izrazi na juniksu "Osnovna" sintaksa regularnih izraza na juniksu je danas zastarela po -{POSIX}- definicijama, iako se na•iroko koristi zbog kompatibilnosti unazad. Ve„ina pomo„nih programa na juniksu svesnih regularnih izraza, kao •to su -{grep}- i -{sed}-, koriste ih podrazumevano, dok pru‚aju podr•ku za pro•irene regularne izraze preko komandnoliniskih argumenata (videti dole). U osnovnoj sintaksi, sa ve„inom se karaktera postupa doslovno (kao zavr•nim znakovima) - sparuju se samo sa sobom samima (tj. "-{a}-" sparuje -{a}-, "(-{bc}-" sparuje (-{bc}-, itd).
Regularni izraz
4
.
Sparuje bilo koji karakter samo jednom. Unutar [] ima svoje uobi€ajeno zna€enje. Na primer, "-{a}-.-{cd}-" sparuje -{abcd}- , "-{a}-..-{d}-" sparuje -{abcd}- .
[]
Sparuje jedan karakter sadr‚an unutar uglastih zagrada. Na primer, "[-{abc}-]" sparuje -{a}-, -{b}- ili -{c}-. "[-{a}---{z}-]" sparuje sva mala slova. Ova se dva stila mogu i me•ati: "[-{abcq}---{z}-]" sparuje -{a}-, -{b}-, -{c}-, -{q}-, -{r}-, -{s}-, -{t}-, -{u}-, -{v}-, -{w}-, -{x}-, -{y}-, -{z}-, ba• kao i "[-{a}---{cq}---{z}-]". Karakter '-' bi trebao biti shva„en doslovno (kao literal) samo ako je prvi ili posljednji karakter unutar zagrada: "[-{abc}--]" ili "[--{abc}-]". Da bi se sparili karakteri '[' ili ']', najlak•e je zatvaraju„u uglastu zagradu postaviti prvu u obuhvataju„im uglastim zagradama: "[][-{ab}]" sparuje ], [, -{a}- ili -{b}-.
[^ ]
Sparuje jedan karakter koji nije sadr‚an unutar uglastih zagrada. Na primer, "[^-{abc}-]" sparuje bilo koji karakter osim -{a}-, -{b}-, i -{c}-. "[^-{a}---{z}-]" sparuje bilo koji karakter koji nije malo slovo. Ba• kao u prethodnim primerima, ovi se stilovi mogu me•ati.
^
Sparuje po€etak linije (bilo koje linije, kad je primenjen u vi•elinijskom na€inu rada)
$
Sparuje kraj linije (bilo koje linije, kad je primenjen u vi•eliniskom na€inu rada)
()
Defini•e "ozna€eni podizraz". to zagradama obuhva„eni izraz sparuje mo‚e kasnije biti dohva„eno - videti slede„i unos za \ n. "Ozna€eni podizraz" je takoƒe "blok". Ova osobina nije prisutna u nekim instancama regexa. U ve„ini pomo„nih programa na juniksu (kao •to su -{sed}- i -{vi}-), karakter "\" (engl. -{backslash}-) mora prethoditi otvorenim i zatvorenim zagradama.
\ -{n}-
Pri €emu -{n}- zamenjuje broj od 1 do 9 - sparuje -{n}--ti spareni ozna€eni podizraz. Ova konstrukcija je teoretski neregularna i nije prihva„ena u pro•irenoj sintaksi regularnih izraza.
*
Izraz od jednog karaktera nakon kojeg sledi "*" sparuje nula ili vi•e kopija sebe. Na primer, "-{ab}-*-{c}-" sparuje -{ac}- , -{abc}-, -{abbbc}- itd. "[-{xyz}-]*" sparuje praznu re€, -{x}-, -{y}-, -{zx}-, -{zyx}-, i tako dalje.
‡ ‡
+
\ n*, pri €emu -{n}- zamenjuje broj od 1 do 9, sparuje nula ili vi•e iteracija n-tog sparenog ozna€enog podizraza. Na primer, "(-{a}-.)-{c}-\1*" sparuje -{abcab}- i -{abcabab}- , ali ne i -{abcac}-. Izraz zatvoren u "\(" i "\)" nakon €ega sledi "*" je neispravan. U nekim slu€ajevima (npr. -{/usr/bin/xpg4/grep}- na -{SunOS}5.8), sparuje jednu ili vi•e iteracija stringa kojeg zagradama obuhva„eni izraz sparuje. U drugim slu€ajevima, (npr. -{/usr/bin/grep}- na -{SunOS}- 5.8), sparuje ono •to zagradama obuhva„eni izraz sparuje, nakon €ega sledi literalni karakter "*".
Izraz od jednog karaktera nakon kojeg sledi "+" sparuje jednu ili vi•e kopija izraza. Na primer, "-{ab+c}-" sparuje -{abc}-, -{abbbc}itd. "[-{xyz}-]+" sparuje -{x}-, -{y}-, -{zx}-, -{zyx}-, i tako dalje. ‡ ‡
\ -{n}-+, pri €emu -{n}- zamenjuje broj od 1 do 9, sparuje jednu ili vi•e iteracija onoga •to sparuje -{n}--ti ozna€eni podizraz. Izraz obuhva„en sa "\(" i "\)" nakon kojeg sledi "+" je neispravan.
{-{x}-,-{y}-} Sparuje posljednji blok barem -{x}- i ne vi•e od -{y}- puta. Na primer, "-{a}-\{3,5}" sparuje aaa, aaaa ili aaaaa. Ova konstrukcija nije prisutna u nekim instancama regexa.
Neke interpretacije regularnih izraza interpretiraju -{backslash}- karakter razli€ito ispred nekih metakaraktera. Na primer, -{egrep}- i -{Perl}- interpretiraju zagrade i vertikalne crte kojima ne prethodi -{backslash}- kao metakaraktere, rezervi•u„i verziju u kojima prethodi u svrhu zna€enja literalnih karaktera. Starije verzije programa -{grep}- nisu podr‚avale operator alternacije "|". Primeri: ".-{at}-" sparuje bilo koji string od tri karaktera poput -{hat}-, -{cat}- ili -{bat}"[-{hc}-]-{at}-" sparuje -{hat}- i -{cat}"[^-{b}-]-{at}-" sparuje sve sparene stringove iz regexa ".-{at}-" izuzev -{bat}"^[-{hc}-]-{at}-" sparuje -{hat}- i -{cat}- ali samo na po€etku linije "[-{hc}-]-{at}-$" sparuje -{hat}- i -{cat}- ali samo na kraju linije Budu„i da mnogi opsezi karaktera zavise o specifi€no odabranim jezi€kim postavkama (npr., u nekim postavkama su slova ureƒena kao -{abc}-..-{yzABC}-..-{YZ}- dok u nekim drugim kao -{aAbBcC}-..-{yYzZ}-), -{POSIX}standard defini•e neke razrede ili kategorije karaktera kao •to je prikazano slede„om tablicom:
Regularni izraz
5
-{POSIX}- razred sli•no izrazu
zna•enje
[:-{upper}-:]
[-{A}---{Z}-]
velika slova
[:-{lower}-:]
[-{a}---{z}-]
mala slova
[:-{alpha}-:]
[-{A}---{Za}---{z}-]
velika i mala slova
[:-{alnum}-:]
[-{A}---{Za}---{z}-0-9] brojevi, velika i mala slova
[:-{digit}-:]
[0-9]
[:-{xdigit}-:]
[0-9-{A}---{Fa}---{f}-] heksadecimalni brojevi
[:-{punct}-:]
[.,!?:...]
interpunkcija (pravopisni znakovi)
[:-{blank}-:]
[ \t]
praznina (engl. -{space}-) i TAB
[:-{space}-:]
[ \t\n\r\f\v]
prazninski karakteri (engl. -{whitespace}-)
[:-{cntrl}-:]
brojevi
kontrolni karakteri
[:-{graph}-:]
[^ \t\n\r\f\v]
karakteri koji se mogu grafi€ki ispisati
[:-{print}-:]
[^\t\n\r\f\v]
karakteri koji se mogu grafi€ki ispisati i karakter praznine
Na primer: -{upper}-:-{ab}-] bi trebao spariti samo velika slova i mala slova '-{a}-' i '-{b}-'. Dogovorom je prihva„eno da se razred [:-{print}-:] sastoji od razreda [:-{graph}-:] uz pridodat karakter praznine (-{space}-). Meƒutim, u -{Perl}--ovim regularnim izrazima [:-{print}-:] sparuje uniju razreda [:-{graph}-:] i [:-{space}-:]. Dodatni razred koga -{POSIX}- ne defini•e, a koga neki alati razumeju je [:-{word}-:], koji se obi€no defini•e kao razred [:-{alnum}-:] sa pridodanim karakterom "_" (engl. -{underscore}-). Ovo odra‚ava €injenicu da je ovako pro•iren razred kori•ten u mnogim programskim jezicima kao skup karaktera dozvoljen u nazivima identifikatora. Ureƒiva€ -{vim}- jo• razlikuje i razrede -{word}- i -{word}---{head}- (koriste„i notaciju \w i \h) po•to u mnogim programskim jezicima karakteri kojima nazivi identifikatora mogu zapo€injati nisu isti kao i karakteri koji mogu biti sadr‚ani na ostalim pozicijama naziva identifikatora. (Za obojeni -{ASCII}- dijagram koji prikazuje -{POSIX}- razrede pogledati -{ASCII}-
[3]
.)
Pohlepni izrazi Kvantifikatori u regularnim izrazima sparuju koliko god mogu - pohlepni su (•to zna€i da poku•avaju spariti najve„i mogu„i broj karaktera). Ovo mo‚e biti zna€ajan problem. Na primer, neko ‚eli na„i prvu instancu sadr‚aja u dvostrukim uglastim zagradama u tekstu -{Another whale explosion occurred on}- [[-{January}- 26]], [[2004]], in [[-{Tainan City}-]], [[-{Taiwan}-]] .
bi najizglednije koristio slede„i uzorak (\[\[.*\]\]) , koji izgleda ispravan (uo€imo da je uglastoj zagradi prethodi -{backslash}- te „e na taj na€in biti interpretirana kao karakter literal). Meƒutim, ovaj „e uzorak ustvari vratiti [[-{January}- 26]], [[2004]], in [[-{Tainan City}-]], [[-{Taiwan}-]] umesto o€ekivanog [[-{January}- 26]]. Ovo se dogaƒa zato •to „e uzorak vratiti sve izmeƒu prve dvije uglate zagrade od [[-{January}- 26]] i posljednje dvije uglate zagrade od [[-{Taiwan}-]]. Postoje dva na€ina izbegavanja ovog problema. Prvi, umesto da se specificira •ta se sparuje, specificira se •to se ne sparuje - u ovom se slu€aju ] ne sparuje, pa „e uzorak biti (\[\[[^\]]*\]\]) . Meƒutim, ovaj uzorak ne„e uop•te spariti na ovom stringu: -{a}- -{b}- -{c}- -{d}- -{e}- -{f}- -{g}-]]
Drugo, moderni alati za regularne izraze dozvoljavaju kvantifikatoru da bude specificiran kao nepohlepan, stavljanjem znaka upitnika ispred kvantifikatora: (\[\[.*?\]\]) .
Regularni izraz
6
Moderni (pro‚ireni) -{POSIX}- regularni izrazi Moderniji "pro•ireni" regularni izrazi mogu €esto biti kori•teni u modernim pomo„nim programima na juniksu koriste„i komandnolinijsku zastavicu "-E". Pro•ireni -{POSIX}- regularni izrazi su sli€ni u sintaksi tradicionalnim regularnim izrazima na juniksu, izuzev nekih izmena. Slede„i metakarakteri su dodati: + Spari poslednji "blok" jedanput ili vi•e puta - "-{ba}-+" sparuje -{ba}- , -{baa}- , -{baaa}- i tako dalje ? Spari poslednji "blok" nula ili jednom - "-{ba}-?" sparuje -{b}- ili -{ba}|
Operator izbora (ili unije skupova): spari ili izraz pre ili izraz posle operatora - "abc|def" sparuje -{abc}- ili -{def}-.
Takoƒe, -{backslash}- karakteri su odba€eni: \{...\} postaje {...} i \(...\) postaje (...). Primeri: "[-{hc}-]+-{at}-" sparuje -{hat}-, -{cat}-, -{hhat}-, -{chat}-, -{hcat}-, -{ccchat}- itd. "[-{hc}-]?-{at}-" sparuje -{hat}-, -{cat}- i -{at}"([-{cC}-]-{at}-)|([-{dD}-]-{og}-)" sparuje -{cat}-, -{Cat}-, -{dog}- i -{Dog}Budu„i da su karakteri '(', ')', '[', ']', '.', '*', '?', '+', '^' i '$' kori•teni kao istaknuti karakteri posebne namene, moraju biti "obele‚eni" ukoliko ih ‚elimo koristiti kao karakter literale. To se obavlja tako •to se ispred njih postavlja karakter '\' koji takoƒe mora biti "obele‚en" ukoliko ‚elimo da ga shvatimo kao literal. Primeri: "-{a}-\.(\(|\))" sparuje string -{a}-.) ili -{a}-.(
-{Perl}--kompatibilni regularni izrazi (-{PCRE}-) -{Perl}--kompatibilni regularni izrazi (engl. -{Perl-compatible regular expressions}-) je implementacija regularnih izraza u programskom jeziku -{Perl}-. Imaju bogatiju i predvidljiviju sintaksu €ak i od pro•irenih -{POSIX}- regexa. Primer njihove predvidljivosti je €injenica da \ uvijek citira (engl. -{quote}-) nealfanumeri€ki karakter. Primer ne€ega •to je mogu„e specificirati u -{Perl}--u ali ne i u -{POSIX}--u je odabir dela sparivanja za koji se ‚eli da bude pohlepan ili ne. Na primer, u uzorku /-{a}-.*-{b}-/, poduzorak .* „e spariti koliko god mo‚e, dok „e uzorak /-{a}-.*?-{b}-/, .*? spariti •to je mogu„e manje. Tako „e u slu€aju stringa "-{a bad dab}-" prvi uzorak spariti celi string, dok „e drugi spariti samo "-{a b}-". Zbog ovih razloga, mnogi drugi pomo„ni programi i aplikacije su prigrlili sintaksu koja jako sli€na -{Perl}--ovoj - na primer -{Java}-, -{Ruby}-, -{Python}-, -{PHP}-, -{exim}-, -{BBEdit}- pa €ak i -{Microsoft}--ov -{.NET framework}- svi koriste sintaksu regularnih izraza sli€nu -{Perl}--ovoj. Nisu sve "-{Perl}--kompatibilne" implementacije regularnih izraza identi€ne, i mnoge implementiraju samo podskup -{Perl}--ovih osobina.
Uzorci za neregularne jezike Mnogi uzorci pru‚aju ekspresivnu mo„ koja nadaleko nadilazi onu regularnih jezika. Na primer, sposobnost grupisanja podizraza zagradama i njihovo dohvatanje u istom izrazu zna€i da uzorak mo‚e spariti string ponavljaju„ih re€i poput -{papa}- ili -{WikiWiki}- koji se zovu "kvadrati" (engl. -{squares}-) u teoriji formalnih jezika. Uzorak za ovakve stringove je samo "(.*)\1". Meƒutim, jezik kvadrata nije regularan, pa €ak ni kontekstno-slobodan. Sparivanje uzoraka sa neograni€enim brojem referenci unazad, kao •to pru‚aju brojni moderni alati, je NP-te•ko. S druge strane, mnogi alati, biblioteke i motori koji pru‚aju takve konstrukcije svejedno koriste naziv regularni izraz za svoje uzorke. Ovo je dovelo do nomenklature u kojoj naziv "regularni izraz" ima razli€ita zna€enja u teoriji formalnih jezika i u sparivanju uzoraka. Predlo‚eno je kori•tenje naziva regex ili jednostavno uzorak u poslednjem kontekstu. -{Larry Wall}- (autor -{Perl}--a) pi•e u Apokalipsi 5: "'[R]egularni izrazi' [€] se samo marginalno odnosi na prave regularne izraze. Svejedno, naziv je rastao sa sposobnostima na•ih motora za sparivanje uzoraka, te se stoga ne‚u ovde poku•ati boriti oko lingvistiƒke
Regularni izraz neophodnosti. Me„utim, uop•teno ‚u koristiti naziv "regexes" (ili "regexen" kad sam u anglosaksonskom raspolo…enju)."
Implementacije i vremena izvr‚avanja Postoje barem dva razli€ita algoritma odlu€ivanja sparuje li (i kako) regularni izraz dati string. Najstariji i najbr‚i se pouzdaje na rezultat proizi•ao iz teorije formalnih jezika koji dozvoljava konverziju bilo kojeg nedeterministi€kog kona€nog automata (NKA) u isti deterministi€ki kona€ni automat (DKA). Algoritam obavlja ili simulira konverziju i potom pokre„e proces prihvatanja ulaznog stringa nad DKA, jedan po jedan znak. Ovaj poslednji korak zahteva linearno vreme u zavisno od du‚ine ulaznog stringa. Preciznije, ulazni string veli€ine -{n}se mo‚e testirati regularnim izrazom veli€ine -{m}- u vremenu -{O}-(-{n}-+2-{m}-) ili -{O}-(-{nm}-), zavisno od detalja programske implementacije. Ovaj algoritam se €esto naziva DKA algoritam. Brz je, ali se mo‚e koristiti samo za sparivanje, ne i za dohvatanje grupisanih podizraza. Postoji varijanta koja mo‚e dohvatiti i grupisane podizraze, ali njeno vreme izvoƒenja usporava sve do -{O}-(-{n}-2-{m}-). Drugi algoritam je sparivanje uzorka i ulaznog stringa kori•tenjem pretra‚ivanja unazad. (Ovaj se algoritam ponekad zove NKA, ali ova terminologija €esto zbunjuje). Vreme izvoƒenja ovog algoritma mo‚e biti eksponencijalno, •to jednostavne implementacije demonstriraju kada sparuju izraze poput "(-{a}-|-{aa}-)*-{b}-" koji sadr‚e i alternaciju i neograni€enu kvantifikaciju, te tako prisiljavaju algoritam da uzme u obzir eksponencijalan broj podizraza. Slo‚enije implemantacije identifikuju i ubrzavaju razne uobi€ajene slu€ajeve. Iako implementacije metodom pretra‚ivanja unazad mogu dati samo eksponencijalnu garanciju u najgorem slu€aju, dozvoljavaju mnogo ve„u fleksibilnost i pru‚aju izra‚ajniju mo„. Na primer, svaka implementacija koja dozvoljava upotrebu referenci unazad, ili pak ostvaruje razna pobolj•anja koja je -{Perl}- uveo, mora biti implementirana preko pretra‚ivanja unatad. Neke implementacije poku•avaju pru‚iti najbolje od oba algoritma tako •to prvo pokre„u DKA sparivanje da vide sparuje li uop€te string regularni izraz, i samo u tom slu€aju obavljaju potencijalno sporije sparivanje pretra‚ivanjem unazad.
Regularni izrazi i -{Unicode}Regularni su izrazi izvorno kori•teni sa -{ASCII}- karakterima. Mnogi motori regularnih izraza danas mogu barati i sa -{Unicode}- simbolima. U ve„ini slu€ajeva je svejedno o kojem se skupu karaktera radi, ali odreƒeni problemi se pojavljuju pro•irivanjem regularnih izraza u -{Unicode}-. Jedan od problema je koji je -{Unicode}- format podr‚an. Svi komandnolinijski motori regularnih izraza podr‚avaju -{UTF-8}-, ali to varira kod biblioteka regularnih izraza. Neke o€ekivaju -{UTF-8}-, dok druge o€ekivaju druga -{Unicode}- enkodiranja (-{UTF-16}-, zastareli -{UCS-2}- ili -{UTF-32}-). Drugi problem je da li je puni -{Unicode}- opseg podr‚an. Mnogi motori regularnih izraza podr‚avaju samo osnovni vi•ejezi€ni farmat, tj. karaktere koji se mogu enkodirati samo u 16 bitova. Samo nekoliko trenutno prisutnih motora mogu baratati punim 21-bitnim -{Unicode}- opsegom. Tre„i problem je varijacija u na€inu kako -{ASCII}- orijentisane konstrukcije mogu biti pro•ireni u -{Unicode}-. Na primer, u -{ASCII}- baziranim implementacijama, karakterni opsezi oblika [-{x}---{y}-] su valjani kad god su -{x}- i -{y}- kodne ta€ke (engl. -{codepoint}-) u opsegu [0x00,0x7F] pri €emu je -{codepoint}-(x) <= -{codepoint}-(y). Prirodno pro•irenje takvih opsega karaktera bi jednostavno promenilo zahtev da krajnje ta€ke le‚e u opsegu [0x00,0x7-{F}-] u zahtev da le‚e u opsegu [0,0x10-{FFFF}-]. Meƒutim, u praksi to nije toliko €est slu€aj. Neke implementacije, poput onoga pomo„nog alata -{gawk}-, ne dozvoljavaju da opsezi karaktera preƒu granice -{Unicode}- blokova. Opseg poput [0x61,0x7F] je ispravan po•to obe krajnje ta€ke le‚e u osnovnom latini€nom bloku, kao •to je ispravan i [0x0530,0x0560] po•to obe krajnje ta€ke le‚e u armenskom bloku, ali opseg poput [0x0061,0x0532] je neispravan budu„i da uklju€uje vi•estruke -{Unicode}- blokove. Drugi motori, poput onoga u
7
Regularni izraz ureƒiva€u -{Vim}-, dozvoljavaju prelaz izmeƒu blokova ali ograni€avaju broj karaktera u opsegu na 128. Takoƒe je podru€je u kojem postoje varijacije u interpretaciji ono koje se ti€e zastavica kontrole razlikovanja velikih i malih slova. Neke takve zastavice deluju samo na -{ASCII}- karaktere. Druge zastavice deluju na sve karaktere. Neki motori imaju razli€ite zastavice, jednu za -{ASCII}- drugu za -{Unicode}-. Takoƒe varira odreƒivanje koji karakteri pripadaju -{POSIX}- razredima. Drugi odgovor na -{Unicode}- je bilo uvoƒenje razreda karaktera za -{Unicode}- blokove i uop•tena svojstva -{Unicode}- karaktera. U -{Perl}--u i u -{Java}- biblioteci -{ java.util.regex}-, razredi oblika \-{p}-{-{InX}-} sparuju karaktere u bloku -{X}- i \-{P}-{-{InX}-} sparuje komplement. Na primer, \-{p}-{-{Armenian}-} sparuje bilo koji karakter u armenskom bloku. Sli€no, \-{p}-{-{X}-} sparuje bilo koji karakter sa op•tim svojstvom karaktera -{X}- i \-{P}-{-{X}-} komplement. Na primer, \-{p}-{-{Lu}-} sparuje sva velika slova.
Upotreba regularnih izraza Regularni izrazi su izrazito korisni u programima kompletiranja koda i bojenja sintakse u integrisanim razvojnim okru‚enjima. Na primer "(-{public}-|-{private}-|-{protected}-)\s*(\w+)\s+(\w+)\s*\("
bi spario funkcije u mnogim programskim jezicima.
Bele‚ke [1] -{Wall, Larry i -{Perl}- 5 razvojni tim}- (2006). -{ perlre: Perl regular expressions (http:/ / perldoc.perl.org/ perlre.html)}-. [2] -{Wall, Larry}- (4. 6. 2002.). -{ Apocalypse 5: Pattern Matching (http:/ / dev.perl.org/ perl6/ doc/ design/ apo/ A05.html)}-. [3] http:/ / billposer.org/ Linguistics/ Computation/ ascii.html
Reference ‡ -{-{Forta}-}-, -{-{Ben}-}-. -{-{Sams Teach Yourself Regular Expressions in 10 Minutes}-}-. -{-{Sams}-}-. -{-{ISBN}- 0-672-32566-7}-. ‡ -{-{Friedl}-}-, -{-{Jeffrey}-}-. -{ -{Mastering Regular Expressions}- (http:/ / regex.info/ ) }-. -{-{O'Reilly}-}-. -{-{ISBN}- 0-596-00289-0}-. ‡ -{-{Habibi}-}-, -{-{Mehran}-}-. -{-{Real World Regular Expressions with Java}- 1.4}- . -{-{Springer}-}-. -{-{ISBN}- 1-59059-107-0}-. ‡ -{-{Liger}-}-, -{-{Francois}-}-; -{-{Craig McQueen}-, -{Paul Wilton}-}-. -{-{Visual Basic .NET Text Manipulation Handbook}-}-. -{-{Wrox Press}-}-. -{-{ISBN}- 1-86100-730-2}-. ‡ -{-{Sipser}-}-, -{-{Michael}-}-. €-{-{Chapter 1: Regular Languages}-}-•, -{-{Introduction to the Theory of Computation}-}-. -{-{PWS Publishing}-}-, 31 ‚ 90. -{-{ISBN}- 0-534-94728-X}-. ‡ -{-{Stubblebine}-}-, -{-{Tony}-}-. -{-{Regular Expression Pocket Reference}-}-. -{-{O'Reilly}-}-. -{-{ISBN}0-596-00415-X}-.
8
Regularni izraz
Spolja‚nje veze ‡ Ve‚be kod asistenta Filipa Mari„a (http:/ / www.matf.bg.ac.rs/ ~filip/ pii/ Vezbe/ regex/ regex.html) Razni primeri regularnih izraza. ‡ -{Regular-Expressions.info}- (http:/ / www.regular-expressions.info/ ) Alati za regularne izraze, primeri i reference. ‡ -{Alati sparivanja uzoraka}- (http:/ / billposer.org/ Linguistics/ Computation/ Resources.html#patterns) ‡ -{Regular Expression Library}- (http:/ / www.regexlib.com/ ) Trenutno sadr‚i preko 1000 regularnih izraza saradnika iz celog svijeta. ‡ -{Boost Regular Expression Library}- (http:/ / www.boost.org/ libs/ regex/ doc/ ) -{C}-++ biblioteka regularnih izraza od -{boost.org}- ( -{free license}- (http:/ / www.boost.org/ LICENSE_1_0.txt)). ‡ -{Javascript RegExp Object Reference}- (http:/ / developer.mozilla.org/ en/ docs/ Core_JavaScript_1. 5_Reference:Global_Objects:RegExp) od -{Mozilla Developer Center}‡ -{Easy Regex Tutorial}- (http:/ / en.kerouac3001.com/ regex-tutorial-8.htm)
ƒlanci ‡ -{Regular Expression Cheat Sheet}- (http:/ / regexlib.com/ cheatsheet.aspx) Referenca regularnih izraza na jednoj stranici ‡ -{Regexp Syntax Summary}- (http:/ / www.greenend.org.uk/ rjk/ 2002/ 06/ regexp.html) Referentna tablica za juniks -{grep}-, -{Emacs}-, -{Perl}-, -{Python}- i -{Tcl}- regularnih izraza. ‡ -{SWC}- - -{Regular Expressions}- (http:/ / seeingwithc.org/ topic7html.html) Regularni izrazi za po€etnike sa linkovima na teoriju ra€unanja i popularne aspekte kori•tenja. ‡ -{Regular Expression Quick Reference}- (http:/ / www.night-ray.com/ regex.pdf) (-{PDF}-) ‡ -{The Regex Coach}- (http:/ / weitz.de/ regex-coach/ ) Besplatni pomo„ni program za testiranje regularnih izraza. ‡ -{The RegexTester}- (http:/ / www.regextester.com/ ) Besplatni -{online}- pomo„ni program za testiranje regularnih izraza. ‡ -{Egrep for linguists}- (http:/ / stts.se/ egrep_for_linguists/ ) Uvod u -{egrep}-.
9
Article Sources and Contributors
Article Sources and Contributors Regularni izraz Source: http://sr.wikipedia.org/w/index.php?oldid=5333476 Contributors: Djordjes, Dungodung, Dzordzm, Michaello, PointDread, Urajkovic, Ž‘’“” –—˜“™”š›, 46 anonymous edits
„…†‡ˆ†‰ Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/
10