BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 2/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 4/51 1-Úvod Automaty a gramatiky(bi-aag) 8. Regulární výrazy - aplikace Jan Holub Katedra teoretické informatiky Fakulta informačních technologií ČVUT v Praze Jak popsat množiny řetězců? Omezený regulární výraz (UNIX shell) Regulární výraz (RE) Rozšířený regulární výraz (ERE) Regulární výraz - jak poznat, o kterém typu se mluví: Regular expression = regulární výraz podle Kleena Regex, Regexp = posixový a perlový regulární výraz c Jan Holub, 2011 Evropský sociální fond. Praha & EU: Investujeme do vaší budoucnosti BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 1/51 Plán přednášky 1. Úvod jak popisovat množiny řetězců 2. Co je regulární výraz a co ještě není Shell pattern matching vs. grep, perl 3. Plnohodnotné regulární výrazy 4. Definice, příklady Posix RE BRE, ERE 5. Definice, příklady Perl RE 6. Shody a rozdíly vůči teorii (Kleene) 7. Podpora RE v programovacích jazycích 8. Implementace regexp enginů 1-Úvod Jak popsat a rozhodovat množiny řetězců? BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 3/51 Omezený regulární výraz (UNIX shell): pattern matching Plnohodnotný regulární výraz: konečný automat Rozšířený reguálrní výraz: matching engine s backtrackingem
BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 6/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 8/51 2 - Coještěnení RE 2-UNIXShell Pattern UNIX shell pattern Popisuje množiny řetězců nad abecedou T, které jsou vlastní podmnožinou množiny regulárních jazyků (tzn. není tak silný, jako RE). Používá speciální metasymboly pro vyjádření libovolného řetězce, libovolného symbolu a libovolného symbolu ze zadané množiny Pattern je posloupnost symbolů a metasymbolů Použité metasymboly: [abc0-9], [ˆd-z] : popisuje množinu povolených, resp. zakázaných symbolů (pro zákaz se vedle ˆ dá použít také! ). Umožňuje pomocí pomlčky popsat rozsah.? : otazník znamená jakýkoli symbol : hvězdička znamená libovolný řetězec \ : escape symbol pro umožnění vkládání [,?,, \ do patternu Řetězec "vyhovuje"patternu, pokud se symbol po symbolu dá namapovat na symboly patternu BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 5/51 2-UNIXShell Pattern BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 7/51 2-UNIXShell Pattern Použité metasymboly: [ ], [ˆ ]? \ Příklady množin řetězců a patternů, které je popisují: řetězce pattern a.txt a.txt a.txt, b.txt [ab].txt a.<3 znaky> a.??? a na začátku a.txt na konci a.txt libovolný řetězec
BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 10/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 12/51 2-UNIXShell Pattern 2-POSIX třídysymbolů Příklady patternů a množin řetězců, které jsou popsány: pattern řetězce main.c [a-ce].c?x?.txt Třídy symbolů, které nahrazují rozsahy v závorkách. Posix třídy jsou na rozdíl od rozsahů přesně definovány a je vhodné je používat, pokud vyžadujeme spolehlivé vyhodnocení patternu. Třídy jsou popsány pomocí [: name :] a samotné se dají použít jen uvnitř hranatých závorek. [[: alpha :]] je to samé co [a-za-z] [[: alnum :]] je to samé co [[: alpha :]01 9] [: alpha :] [: alnum :] [: ascii :] [: blank :] [: cntrl :] [: digit :] [: graph :] [: lower :] [: print :] [: punct :] [: space :] [: upper :] [: word :] [: xdigit :] BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 9/51 2-UNIXShell Pattern BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 11/51 2-UNIXShell Pattern Příklady patternů a množin řetězců, které jsou popsány: pattern řetězce main.c main.c [a-ce].c a.c, b.c, c.c, e.c?x? axa, axb, axc,....txt cokoli na začátku a.txt na konci libovolný řetězec Pokud chceme popsat řetězec, co obsahuje znak(y), \, [,?, potřebujeme před tyto symboly v patternu vložit escape symbol \ nebo použít Nadto pozor na způsob, jakým shell interpretuje neescapované metasymboly: ls [a].txt: existuje-li a.txt, nalezne pouze jej. ls [a].txt: nalezne [a].txt, pokud tento existuje a zároveň neexistuje a.txt
2-Pattern-poznámky na závěr BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 14/51 3 - Plnohodnotné regulární výrazy BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 16/51 Definice významu metasymbolů se mezi Unixovými nástroji liší v závislosti na použití. Některé například vyhledají s pomocí řetězce obsahující / a jiné nástroje zase ne. Při vyhledávání souborů patterny a? nenaleznou soubory začínající tečkou. Použijte. Vyhledávanému vzorku se často říká glob Dělení symbolů v regulárních výrazech: Literály (ordinary characters) Metasymboly (special characters) 1. Kotvy (anchors) 2. Zástupné symboly (character sets) 3. Modifikátory a kvantifikátory (modifiers, quantifiers) Escape symbol BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 13/51 3 - Plnohodnotné regulární výrazy BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 15/51 3 - Plnohodnotné regulární výrazy V praxi se regulární výrazy používají velmi běžně. Přímo vycházejí z Kleeneovy teorie a podle potřeb ji dále rozvíjejí. Vyvinuly se dva hlavní standardy: Posixové základní a rozšířené RE (BRE a ERE) Perlové regexpy Význam symbolů v regulárních výrazech: Literály: znamenají samy sebe Metasymboly: mají speciální význam 1. Kotvy: určují pozici výskytu v textu 2. Zástupné symboly: znamenají libovolný literál z dané množiny 3. Modifikátory a kvantifikátory: Umožňují operace na regulárních výrazech jako je sjednocení nebo iterace Escape symbol: dělá z metasymbolu literál
3 - Plnohodnotné regulární výrazy BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 18/51 4-BRE-Zástupné symboly BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 20/51 Řetězec x je výskyt regulárního výrazu r, pokud řetězec x patří do množiny řetězců definované regulárním výrazem r. Popis množiny symbolů v BRE: x symbol x. jakýkoli symbol [abc] a nebo b nebo c [a-c] a nebo b nebo c [ˆa-c] jakýkoli symbol kromě a, b a c [[: alpha :][: space :]#] jakýkoli symbol abecedy, mezerový symbol nebo # BRE akceptuje posixové třídy symbolů BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 17/51 4 - PosixovéBRE BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 19/51 4-BRE-Kvantifikátory BRE = Basic Regular Expressions Základní norma pro UNIXové regulární výrazy Tuto normu splňuje většina UNIXových nástrojů, které pracují s RE. Kvantifikátory následují za regulárním výrazem. Odpovídají operaci iterace, ale umí být i jemnější: \{m, n\} \{m, \} \{m\} 0 nebo víc výskytů za sebou od m po n výskytů za sebou m a víc výskytů za sebou m výskytů za sebou \ před { a } je nutný.
4 - BRE-Kvantifikátory-příklady BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 22/51 4-BRE-Kotvy-příklady BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 24/51 Kvantifikátory následují za regulárním výrazem. Odpovídají operaci iterace, ale umí být i jemnější: Regulární výraz popsané řetězce ba b, ba, baa, baaa,... [ba] libovolně dlouhý řetězec symbolů a a b \(ba\) [ba]\{1, 2\} ε, ba, baba, bababa b, a, bb, ba, ab, aa a\{3, \} aaa, aaaa, aaaaa,... [ba]\{2\} bb, ba, ab, aa Kotvy slouží k popisu pozice výskytu na řádku. Regulární výraz Nalezne Zavrhne ˆkop kopáč Franta známý kopytník chod$ dlouhý podchod pochod na jih \<kol kolo okolo tok\> roztok stokrát \ před { a } je nutný. BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 21/51 4-BRE-Kotvy BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 23/51 4 - BRE-Speciálníznaky Kotvy slouží k popisu pozice výskytu na řádku. Kotva Význam ˆ Začátek řádku $ Konec řádku \< Začátek slova (nestandardní, původem z vi) \> Konec slova (nestandardní, původem z vi) \ před < a > je nutný. Další znaky v BRE: Znak Význam \(\) Vytvoření skupiny; skupiny jsou implicitně číslovány, aby se na ně dalo odkazovat \čislo Opakovaný výskyt vzorku z odpovídající závorky (mechanismus pro pamatování!) \n Znak nové řádky (nestandardní; používá například sed) \ před ( a ) je nutný.
4 - BRE-Speciálníznaky BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 26/51 4-BRE-různý významescape \ BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 28/51 Další znaky v BRE: Regulární výraz \(hrad\) \(hrad \)\1 popsané řetězce hrad hrahra, hradhrad, hraddhradd,... Pokud je znak \ před, [,., \, ˆ, $, "vypíná" speciální význam těchto znaků. Pokud je znak \ před (, ), <, >, {, }, "zapíná" speciální význam těchto znaků. Co popisuje [\ \[ ]\{2\}? \ před ( a ) je nutný. BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 25/51 4-BRE, ERE-POZOR! BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 27/51 4 - PosixERE Veškeré RV, pokud není řečeno jinak, jsou "hladové" (greedy). To znamená, že se budou snažit najít nejdelší možný vzorek: Text: Pattern: Nalezený vzorek: aabcaabcde a. b aabcaab BRE dovolují popisovat některé neregulární jazyky a zároveň neumí všechny regulární Chybí možnost popsat alternativu - sjednocení BRE nejednotně používají escape znak Proto existují Extended Regular Expressions (ERE), které se (s diskutabilní úspěšností) snaží řešit problémy BRE
4-ERE-změny oprotibre BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 30/51 4-ERE-změny oprotibre BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 32/51 Ruší se následující speciální znaky: \{\} \<\> \(\) \cislo Nové metasymboly pro skupinu: ( ) skupinové závorky alternativa ve skupině ERE (ab bc cd) (hrad zamek) popsaná množina řetězců {ab, bc, cd} {hrad, zamek} Kvantifikátory - příklady: Regulární výraz popsané řetězce ba b, ba, baa, baaa,... ba+ ba, baa, baaa,... ba? b, ba [ba] libovolně dlouhý řetězec symbolů a a b (ba) ε, ba, baba, bababa [ba]{1, 2} b, a, bb, ba, ab, aa a{3, } aaa, aaaa, aaaaa,... [ba]{2} bb, ba, ab, aa BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 29/51 4-ERE-změny oprotibre BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 31/51 4 - BREaERE-výskyt Nové kvantifikátory: kvantifikátor význam 0 nebo víc opakování + 1 a víc opakování? 0 nebo 1 výskyt {m, n} od m po n výskytů {m, } m a víc výskytů {m} m výskytů Výskyt v UNIXových nástrojích: BRE ERE vi awk more nawk ed egrep grep grep -E sed sed -r......
4-BREaERE - kontroverze BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 34/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 36/51 Ačkoli se norma pokouší definovat "správné" regulární výrazy, nepředkládá přehledný a snadno použitelný formalismus Téměř každý UNIXový nástroj používá vlastní variantu regulárních výrazů - je důležité otestovat RE před jeho pracovním nasazením Zjištění, zda řetězec $string obsahuje výskyt regulárního výrazu regex: $string =~m/regex/; Náhrada prvního výskytu za jiný: $string =~s/regex/replacement/; Náhrada všech výskytů za jiný: $string =~s/regex/replacement/g; BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 33/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 35/51 Perl je skriptovací jazyk (počátek 90. let) Má přímo zabudovanou podporu regulárních výrazů Staví na posixových RE, rozšiřuje je a zpříjemňuje práci s nimi Některá rozšíření způsobila, že perlový regexp popisuje striktně více než třídu regulárních jazyků (podobnost s BRE) Za standard se bere Perl 5.10 regexp Perl navazuje na ERE a přidává další funkcionalitu: Opět zavádí pamatování a odkazování pomocí \cislo Lazy kvantifikátory (vedle greedy) Umožňuje lookahead, lookbehind Vlastní, "shorthand" třídy symbolů Nové kotvy
BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 38/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 40/51 Sjednocené metasymboly: { }[ ]( )ˆ$. +?\ mají speciální význam Pokud je chceme vyhledat jako literály, musí jim předcházet \ Escape sekvence pro ASCII znaky: \n, \r, \t, \x[hexa], \u[unicode], Modifikátory vyhledávání výskytu regulárního výrazu: i = ignore case g = v případě nahrazování vyhledat a nahradit všechny výskyty. Při opakovaném hledání hledat od posledního výskytu.... BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 37/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 39/51 Sjednocené metasymboly - příklady: Regulární výraz popsané řetězce /(abc){1, 2}/ abc, abcabc /[ab]?d/ d, ad, bd /ˆ. $/ jakákoli celá řádka /a+b c+/ ab, aab,..., c, cc,... /\ \\\+/ \+ Příklady: Regulární výraz /hi\nworld/ popsané řetězce hi world /entry\t\x61\x74/ entry at /hello/i hello, Hello, hello,...
BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 42/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 44/51 Vkládání proměnných do regulárních výrazů: $var = hr; /${var}ad/ nalezne výskyt řetězce hrad Nové třídy proměnných: \d, \D = [0-9], [ˆ0-9] \s, \S = [mezerové znaky], [ˆ\s] Zpětná reference na výskyt uzávorkovaný v regulárním výrazu pomocí ( ): Zevnitř regulárního výrazu: \<pořadové číslo otevírací závorky> Vně regulárního výrazu: $<pořadové číslo otevírací závorky> Závorka, která si nemá pamatovat, má formu (? : regex) \w, \W = [znaky slov], [ˆ\w] Nová kotva \b nalezne hranice slov. BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 41/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 43/51 Příklady: Regulární výraz popsané řetězce $x = int; /${x}\s+\w+; / int a;, int b;, int ab;,... /\b\d+\b/ číslo (jen z číslic) Lookahead - pozitivní i negativní (za výskytem se má něco vyskytovat, nebo nesmí vyskytovat). (?=regexp) (?!regexp) Lookbehind - pozitivní i negativní (před výskytem se má něco vyskytovat, nebo nesmí vyskytovat). Regulární výraz použitý v lookbehindu musí mít fixní délku výskytu. (?<=regexp) (?<!regexp)
BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 46/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 48/51 Příklady: Regulární výraz popsané řetězce /([abc]+)d\1/ ada, bdb, cdc, aadaa, abdab,... proměnná $1: a, b, c, aa, ab,... /(? : so ra)k/ sok, rak (pro připomenutí?) /auto(?=mat)/ auto (po kterém musí následovat mat ) /(?<=pod)chod/ chod (který musí předcházet pod ) Příklad: budeme vyhledávat v textu abcabcabcd regexp výskyt abc d ano (abc) (abc) d ano, $1 = abcabcabc, $2 = (abc)?(abc) d ano, $1 =, $2 = abcabcabc (abc) +(abc) d ano, $1 = abcabcabc, $2 = (abc) +(abc)+d ne BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 45/51 BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 47/51 6-Shody arozdílyvůči teorii Greedy, lazy a possessive kvantifikace Všechny kvantifikátory jsou ze základu greedy Pokud chceme lazy kvantifikátor, napíšeme za kvantifikátor?, pro possessive + greedy lazy possessive? + + +? ++......?...+ Posixové a perlové regulární výrazy vycházejí z Kleeneovy teorie, ale jsou zde odlišnosti: Kleene RE popisuje regulární jazyky Žádný kontext Nejjednodušší možný popis (bez +,?, { }, ˆ,..) BRE/ERE/Perl RE popisuje i něco navíc (díky odkazům) Kotvy, lookaround Popis co nejpříjemnější pro užití (Perl)
7 - PodporaREvjazycích BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 50/51 9-Závěr-odkazy adotazy Zabudována jako součást syntaxe přímo do jazyka Perl, Ruby, Awk, Tcl, PHP,... Prostřednictvím knihoven a funkcí Java, C, C++,... Za vzor se berou Perl 5.10 regulární výrazy http://www.regular-expressions.info/quickstart.html http://www.gnu.org/software/sed/manual /html_node/regular-expressions.html http://www.grymoire.com/unix/regular.html http://www.grymoire.com/unix/sed.html#uh-0 http://perldoc.perl.org/perlre.html http://regexpal.com/ BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 49/51 8- Regexp vyhledávací enginy BI-AAG (2011/2012) J. Holub: 8. Regulární výrazy - aplikace p. 51/51 DKA (převod RV na DKA) NKA (převod RV na NKA, Thompsonova metoda) Backtracking vyhledávání (nutné pro neregulární jazyky). Pozor, až exponenciální složitost ve srovnání s automaty!