2.5. Regulární výrzy [181012-1111 ] 21 2.5 Regulární výrzy 2.5.1 Regulární jzyky jsme definovli jko ty jzyky, které jsou přijímány konečnými utomty; ukázli, že je jedno, zd jsou deterministické neo nedeterministické. Regulární výrzy slouží jko dlší popis regulárních jzyků viz 2.5.4 2.5.5. (Byly to právě regulární výrzy, které dly jméno třídě jzyků přijímných konečnými utomty.) 2.5.2 Regulární výrzy nd ecedou. Definice. Je dán eced Σ. Množin všech regulárních výrzů nd Σ je definován induktivně tkto: je regulární výrz, ε je regulární výrz, je regulární výrz pro kždé písmeno Σ, jsou-li r 1 r 2 regulární výrzy, pk r 1 + r 2, r 1 r 2 r 1 jsou regulární výrzy. 2.5.3 Jzyk reprezentující regulární výrz. Kždý regulární výrz nd ecedou Σ reprezentuje jzyk nd ecedou Σ to tkto: Regulární výrz reprezentuje jzyk. Regulární výrz ε reprezentuje jzyk {ε}. Je-li Σ, pk regulární výrz reprezentuje jzyk {}. Jestliže regulární výrz r 1 reprezentuje jzyk L 1 regulární výrz r 2 reprezentuje jzyk L 2, pk regulární výrz r 1 + r 2 reprezentuje jzyk L 1 L 2 regulární výrz r 1 r 2 reprezentuje jzyk L 1 L 2. Jestliže regulární výrz r reprezentuje jzyk L, pk regulární výrz r reprezentuje jzyk L. 2.5.4 Vět. Kždý jzyk reprezentovný regulárním výrzem je regulárním jzykem. Důkz: Regulární výrzy, ε, (pro Σ) reprezentují po řdě jzyky, {ε}, {}. Všechny tyto jzyky jsou regulární. O třídě regulárních jzyků víme, že je uzvřen n sjednocení, zřetězení Kleeneho operci. To znmená, že jsou-li jzyky reprezentovné regulárními výrzy r, r 1 r 2 regulární, pk jsou regulární i jzyky reprezentovné regulárními výrzy r 1 + r 2, r 1 r 2 r. 2.5.5 Kleeneho vět. Kždý jzyk přijímný konečným utomtem je možné reprezentovt regulárním výrzem. Důkz: Je dán DFA M = (Q, Σ, δ, q 0, F ), který přijímá jzyk L. Pro jednoduchost oznčme množinu stvů Q = {1,..., n} počáteční stv q 0 = 1. Pro k = 0, 1,..., n definujeme množiny slov R (k) tkto: R (k) je množin těch slov w, pro něž δ (i, w) = j sled z i do j má vnitřní stvy jen z {1,..., k}. Zřejmě pltí: pro i j je R (0) = { δ(i, ) = j}; pro i = j je R(0) i,i = {ε} { δ(i, ) = i}. V oou přípdech se jedná o konečnou množinu. Proto umíme množinu R (0) regulárním výrzem. reprezentovt Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
22 [181012-1111 ] Předpokládejme, že všechny množiny slov R (k) výrzem r k. Pk pro množinu slov R(k+1) pltí: pro dné k umíme reprezentovt regulárním Proto množinu R (k+1) opět regulární výrz. R (k+1) = R (k) R(k) i,k+1 (R(k) k+1,k+1 ) R (k) k+1,j. lze reprezentovt regulárním výrzem r k + rk i,k+1 (rk k+1,k+1 ) r k k+1,j, což je Nvíc, jzyk L je sjednocení všech množin R (n) 1,j regulárním výrzem j F rn 1,j. 2.5.6 Ekvivlentní regulární výrzy. pro j F. Proto jzyk L je reprezentován Definice. Řekneme, že dv regulární výrzy r q jsou ekvivlentní, jestliže jimi reprezentovné jzyky jsou stejné. Fkt, že regulární výrzy r q jsou ekvivlentní zpisujeme r = q. 2.5.7 Některé ekvivlentní regulární výrzy. Jsou-li r, p q regulární výrzy, pk 1. p + q = q + p, 2. (p + q)r = p r + q r, r(p + q) = r p + r q, 3. (r ) = r, (ε + r) (ε + r) = r, 4. (p + q) = (p q ), 5. (p + q) = (p + q), 6. (p + q) = (p q) p, 7. r = ε + rr, 8. rr = r r, 9. (p q) = ε + p (q p) q, 10. (p q) p = p (q p), 11. r = = r. Poznámk. Pomocí výše uvedených vzthů není vždy jednoduché zjistit, zd dv regulární výrzy jsou ekvivlentní. Algoritmicky se dný prolém řeší npř. tk, že ke kždému regulárnímu výrzu r q njdeme konečný deterministický utomt, které přijímjí jzyky reprezentovné těmito regulárními výrzy. Získné utomty následně zredukujeme. Jsou-li redukovné utomty isomorfní, jsou regulární výrzy r q ekvivlentní, jink ekvivlentní nejsou. Dv způsoy, jk k dnému regulárnímu výrzu r zkonstruovt DFA, který přijímá jzyk reprezentovný tímto výrzem, ukzujeme v dlším odstvci. 2.5.8 Konstrukce konečného utomtu k regulárnímu výrzu. Je dán regulární výrz r. Sestrojit k němu konečný deterministický utomt, který přijímá jzyk L r reprezentovný regulárním výrzem r, můžeme dvěm způsoy: I. Pomocí důkzu Kleeneho věty. Regulární výrz rozdělíme n několik jednoduchých podvýrzů, pro které umíme jednoduše sestrojit DFA. Nyní pomocí metod z důkzu věty 2.4.6 sestrojíme nedeterministický utomt M 1, je-li to nutné, tk s ε přechody, který přijímá jzyk L r. Podmnožinovou konstrukcí k němu sestrojíme deterministický utomt M 2 přijímjící stejný jzyk. Je-li potře, M 2 redukujeme tím dostneme hledný utomt. II. Přímou metodou. Jednotlivé vstupní symoly regulárního výrzu r očíslujeme. Dále zjistíme 1. všechny očíslovné symoly, kterými může některé slovo jzyk L r zčínt; 2. všechny dvojice očíslovných symolů, které mohou po soě následovt v některém slově jzyk L r ; Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
2.5. Regulární výrzy [181012-1111 ] 23 3. všechny očíslovné symoly, kterými může některé slovo jzyk L r končit; 4. zd prázdné ε slovo leží v jzyce L r. Stvy nedeterministického utomtu M jsou všechny očíslovné symoly počáteční stv s. Stvový digrm utomtu M dostneme tkto: Ze stvu s vede hrn do kždého stvu i, Σ, který je vyjmenován v odě 1. Hrn je v tomto přípdě oznčen symolem. Ze stvu i do stvu j (, Σ) vede hrn oznčená právě tehdy, když dvojice i j yl vyjmenovná v odě 2. Koncové stvy jsou všechny k, které jsou vyjmenovné v odě 3. Jestliže prázdné slovo ε ptří do jzyk L r, je koncovým stvem i počáteční stv s. DFA přijímjící jzyk L r dostneme podmnožinovou konstrukcí z utomtu M přípdnou redukcí. Oě metody ukážeme n příkldě. 2.5.9 Příkld. Pro regulární výrz r = ( + ). Řešení. I. metod. Regulární výrz r rozdělíme n r 1 = ( + ), r 2 =. Pk r = r 1r 2. Pk jeden ε-nfapřijímjící jzyk L r je dán tulkou stvovým digrmem ε q 0 {q 1, q 2 } {q 3 } q 1 {q 2 } q 2 {q 0 } q 3 q 0 ε q 2 q1 q 3 Podmnožinovou konstrukcí dostneme DFA: {q 0 } {q 0, q 1, q 2 } {q 3 } {q 0, q 1, q 2 } {q 0, q 1, q 2 } {q 0, q 2, q 3 } {q 3 } {q 0, q 2, q 3 } {q 0, q 1, q 2 } {q 3 } Po přejmenování stvů má výsledný DFA tulku: stvový digrm I A K A A L K O O L A K O O O Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
24 [181012-1111 ] A I K L, O, II. metod. Očíslujeme jednotlivé výskyty vstupních symolů: ( 1 + 2 3 ) 4. 1. Slovo z jzyk L r může zčínt: 1, 2 neo 4. 2. Po soě mohou následovt (ve slově z L r ): 1 1, 1 2, 1 4, 2 3, 3 1, 3 2 3 4. 3. Slovo z L r končí 4. 4. Prázdné slovo neleží v L r. Zkonstruujeme nedeterministický utomt podle II. metody. Ten má stvový digrm 2 s 1 4 3 Podmnožinovou konstrukcí dostneme utomt s tulkou s { 1, 2 } { 4 } { 1, 2 } { 1, 2 } { 3, 4 } { 4 } { 3, 4 } { 1, 2 } { 4 } Automt už je redukovný po přejmenování stvů dostáváme stejný utomt jko metodou I. 2.5.10 Regulární výrz reprezentující jzyk L(M). Je dán deterministický utomt M. Regulární výrz reprezentující jzyk L(M) dostneme ud postupem z důkzu Kleeneovy věty neo úprvmi stvového digrmu. Ke stvovému digrmu přidáme dv stvy; to nový počáteční stv strt nový koncový stv f in. Dále přidáme hrny oznčené prázdným slovem ε ze stvu strt do počátečního stvu utomtu z kždého koncového stvu do stvu fin. Oznčení hrn chápeme jko regulární výrzy. S tkto vzniklým orientovným grfem provádíme úprvy: Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
2.6. Prktické použití regulárních výrzů. [181012-1111 ] 25 ) (Odstrnění prlelních hrn.) Jsou v grfu dvě prlelní hrny oznčené regulárními výrzy r 1 r 2, nhrdíme je jednou hrnou oznčenou regulárním výrzem r 1 + r 2. ) (Odstrnění smyčky.) Je-li v grfu smyčk ve vrcholu q oznčená regulárním výrzem r, pk smyčku odstrníme oznčení s liovolné hrny zčínjící v q změníme n r s. c) (Odstrnění vrcholu q.) Jestliže v q není smyčk, odstrníme jej tímto postupem: Kždou dvojici hrn e 1 e 2, kde KV (e 1 ) = q = P V (e 2 ) nhrdíme hrnou e s P V (e) = P V (e 1 ) KV (e) = KV (e 2 ). Je-li hrn e 1 oznčen regulárním výrzem r hrn e 2 regulárním výrzem s, je e oznčen regulárním výrzem r s. Končíme tehdy, když grf má jen dv vrcholy, to strt fin, jedinou hrnu, to ze strt do f in. Oznčení této hrny je hledný regulární výrz. 2.6 Prktické použití regulárních výrzů. Teorie regulárních jzyků ptří k úhelným kmenům informtiky. Prxe čsto ývá méně učesná než teorie s regulárními jzyky to dopdlo podoně. Proto prktickému použití regulárních jzyků, regulárních výrzů konečných utomtů věnujeme smosttnou sekci. 1 2.6.1 Kde lze potkt regulární jzyk. Nejčstější použití regulárních jzyků není ni moc nápdné. Ve většině prkticky používných počítčových jzyků lze rozlišit části (podřetězce), tzv. lexikální elementy, též tokeny, které lze pokládt z slov z regulárního jzyk. Npř. v ěžných progrmovcích jzycích to jsou zápisy konstnt, zápisy identifikátorů, klíčová slov, relční znménk pod. Progrm, který dný jzyk nlyzuje (syntktický nlyzátor, prser), ovykle oshuje proceduru, které se říká lexikální nlyzátor která funguje jko konečný utomt. Lexikální nlyzátor při kždém svém vyvolání přečte ze vstupního souoru nejdelší část, která tvoří jeden lexikální element voljícímu progrmu vrátí jeho typ hodnotu. Zytek syntktického nlyzátoru může díky tomu ýt jednodušší, neot prcuje už jen s lexikálními elementy. Dlší význmné použití regulárních jzyků je pro uživtele viditelnější je to vyhledávání výskytů slov dných regulárním výrzem. Progrm grep opisuje n výstup ty řádky vstupního souoru, které oshují podřetězec popsný regulárním výrzem. Mnohé editory dovedou při opercích vyhledej, popř. vyhledej nhrd hledt podle dného regulárního výrzu. Toto yl mimochodem nejstrší plikce regulárních výrzů. V některých progrmovcích jzycích (Perl, AWK, Ruy) je vyhledávání ( popř. náhrd) vzoru dného regulárním výrzem součástí jzyk. V mnoh dlších jzycích jsou k dispozici knihovny. Vyhledávání vzorů se tké využívá v ntivirech v ntispmových filtrech. 2.6.2 Zápis regulárních výrzů. Formální lgerický zápis regulárních výrzů, jk yl definován v 2.5.2, je vhodný pro teoretické úvhy. Pro prktické účely se používá syntx, která zejmén zjednodušuje zápis množin znků dovoluje flexiilně vyjádřit počty opkování. Regulární výrz. (tečk) reprezentuje liovolný znk (přesněji: jzyk tvořený všemi jednoznkovými slovy). Pro zápis oecnější množiny znků se používá konstrukce s hrntými závorkmi. Příkldy: [c] reprezentuje liovolný jeden ze znků,, c. [-f] reprezentuje liovolný jeden ze znků ž f. [0-9] reprezentuje liovolnou číslici. [^c] reprezentuje liovolný znk jiný než, c. [^-f] reprezentuje liovolný znk jiný než ž f. Znk ( svislítko, v UNIXu rour) znčí lterntivu, tedy operci, která se v lgerickém zápisu znčí +. 1 Tuto sekci npsl Jiří Demel. Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
26 [181012-1111 ] Hvězdičk (Kleeneho operce) se zpisuje v řádce, nikoli jko exponent. Znk + oznčuje jedno neo více opkování předcházejícího. Tedy r+ = rr. Znk? oznčuje žádný neo jeden výskyt předchozího. Tedy r? oznčuje to, co y se v lgerickém zápise vyjádřilo jko (ε + r). Pro oecnější počty opkování předchozího znku neo výrzu v závorkách se používá konstrukce se složenými závorkmi. Příkldy: r{3} znčí přesně 3 opkování, r{3,} znčí 3 neo více opkování, r{3,5} znčí 3 ž 5 opkování. Znk ^ n zčátku výrzu znčí zčátek textu neo řádky. Znk $ n konci výrzu znčí konec textu neo řádky. Některé znky (npř. []^$.*) mjí v prktických regulárních výrzech speciální význm popsný výše. Potřeujeme-li některý z těchto znků použít ve výrzu jko oyčejný znk, je tře před tento znk zpst orácené lomítko, tj. tkzvně znk escpovt. Npř. pro vyhledání doménového jmén fel.cvut.cz je tře escpovt tečky, tedy správný výrz je fel\.cvut\.cz, jink y výrzu vyhovovlo tké nesprávné felxcvutcz. Některé speciální znky (npř. {}()+?) se ohužel v prxi používjí nejednotným způsoem. V některých implementcích je nutno tyto znky escpovt, y měly speciální význm, jinde je nopk nutno escpovt, y fungovly jko oyčejné znky ez speciálního význmu. Prktické regulární výrzy se nejčstěji používjí pro hledání podslov v prohledávném textu. Tedy npř. výrz sen ude nlezen v textu ndnesený. Chceme-li hledt sen smotný, musíme použít výrz ^sen$. Výrz reprezentující prázdné slovo je ^$. Výše uvedený popis prktických regulárních výrzů zdlek není úplný. Pro zevrunější poučení doporučuji text Pvl Strpy http://www.nti.tul.cz/~strp/docs/regvyr/, kde je i tulk odlišností syntxe regulárních výrzů v různých implementcích. 2.6.3 Implementce regulárních výrzů jsou zhru tří typů. Simulce DFA je nejrychlejší. Je-li DFA, který rozpoznává jzyk dný regulárním výrzem, již sestrojen, pk smotné prohledávání vyžduje čs O(t), kde t je délk prohledávného textu. Konstrukce DFA k dnému regulárnímu výrzu ovšem vyžduje nějký čs pmět, je to tedy něco jko investice, která se ne vždy vypltí. Pro hledání v rozsáhlých textech je simulce DFA nejrychlejší ze všech tří možností. Stv reprezentován návěštím v progrmu. Progrm přečte znk podle toho, co přečetl, pomocí příkzů if cse skočí n návěští, které reprezentuje následující stv DFA. Vhodné, pokud je regulární jzyk předem znám. Používá se v lexikálních nlyzátorech. Stv reprezentován oshem proměnné. Přechodová funkce může ýt dán ve formě dvourozměrného pole, kde přečtený znk dosvdní stv se použijí jko indexy prvek pole oshuje nový stv. Simulce NFA proíhá tk, že vždy po přečtení znku ze vstupu vypočteme množinu všech stvů, do nichž se NFA tímto znkem může dostt. Tedy z předchozí množiny ktivních stvů počítáme novou množinu. Automt sice je nedeterministický, le díky konečnému počtu stvů lze sndno prlelně sledovt všechny možné větve výpočtu. Není tedy tře žádný ctrcking. 2 Simulce NFA prcuje v čse O(qt), kde q je počet stvů NFA t je délk prohledávného textu. Vlstní prohledávání je tedy pomlejší než v přípdě DFA, le počáteční konstrukce NFA je jednodušší rychlejší než konstrukce DFA. Existuje vrint, kdy ěhem simulce činnosti NFA je postupně vytvářen DFA. 2 Pozor, v jink velmi pěkném textu Pvl Strpy http://www.nti.tul.cz/~strp/docs/regvyr/ jsou pojmy nedeterministický, deterministický rekurzivní použity poněkud nešt stně: slovem deterministický je oznčen simulce NFA, nedeterministický stroj znmená rekurzivní hledání možnost použít DFA tm vůec není zmíněn. Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018
2.6. Prktické použití regulárních výrzů. [181012-1111 ] 27 Rekurzivní hledání (cktrcking) nevyužívá konečné utomty, nmísto toho porovnává prohledávný text přímo s regulárním výrzem když nenjde možnost pokrčovt, vrcí se zkouší porovnt prohledávný text s dlší částí regulárního výrzu. N některých regulární výrzech prcuje cktrcking znčně neefektivně. Npř. (.*):(.*):(.*):(.*):(.*) pro hledání pěti údjů oddělených čtyřmi dvojtečkmi neo je-li hledán výrz????? v textu. Výhodou rekurzivního hledání je rychlejší strt, le zejmén možnost rozšířit množinu vyhledávných slov z hrnice regulárních jzyků pomocí tzv. zpětných referencí. Kždý pár kultých závorek, kromě toho, že seskupuje to, co je uvnitř, zároveň vymezuje část vstupního textu, která se shodovl s vnitřkem závorky. N tkto zpmtovnou část vstupního textu se pk lze odvolt zápisem \číslo. Tedy npř. ve výrzu (.*)\1 zstupuje \1 text, který yl reprezentován výrzem (.*). Výrz (.*)\1 tedy reprezentuje jzyk tvořený všemi zdvojenými slovy, npř. uu neo holhol. Tento jzyk není regulární, není dokonce ni ezkontextový. Historicky první implementce regulárních výrzů (popsán v článku z roku 1968) yl zložen n prlelní simulci NFA. Jejím utorem yl Ken Thomson, jeden z otců UNIXu. Snd proto se to v UNIXu regulárními výrzy jen hemží. Otcové UNIXu teorii regulárních jzyků konečných utomtů doře znli, První open source implementce všk yl zložen n cktrckingu. Díky otevřenosti se rozšířil mimo jiné do Perlu odtud skrze PCRE (Perl Comptile Regulr Expressions) do knihoven řdy dlších jzyků. Detilní popis včetně příkldu implementce včetně historických podroností lze njít v článku http://swtch.com/~rsc/regexp/regexp1.html Mrie Demlová: Jzyky, utomty grmtiky Před. 5: 29/10/2018