Reguliere Expressies Een reguliere expressie (regexp, regex, regxp) is een string (een woord) die, volgens bepaalde syntaxregels, een verzameling strings (een taal) beschrijft Reguliere expressies worden veel gebruikt in Unix texteditors, tools, programmeertalen, voor het zoeken naar patronen in tekst, en voor substitutie van strings 1/15 18 oktober 2004
Geschiedenis Theorie van formele talen Kleene s algebra van reguliere verzamelingen Ken Thompson introduceerde de notatie in de Unix editor ed Regex worden nu gebruikt in bijvoorbeeld grep, awk, emacs, vi, lex, perl. 2/15 18 oktober 2004
Reguliere expressies in de theorie van formele talen (1) Een reguliere expressie representeert een verzameling strings/woorden (een taal). Reguliere expressies worden opgebouwd uit constanten en operaties. Zij gegeven een eindig alfabet Σ, dan zijn de volgende constanten gedefinieerd: (lege verzameling) representeert de lege verzameling (lege string) ɛ representeert {ɛ} (ɛ is een string met lengte 0) (literals) een karakter a in Σ representeert de verzameling {a} 3/15 18 oktober 2004
Reguliere expressies in de theorie van formele talen (2) De operaties (voor reguliere expressies R en S): (concatenatie) RS representeert de verzameling {αβ α R, β S}. (vereniging) R S representeert de vereniging van R en S (Kleene star) R representeert de afsluiting van R onder concatenatie, i.e., R = ɛ R RR RRR Bindingsterkte: Kleene star > concatenatie > vereniging. Haakjes worden weggelaten als dat kan: (ab)c wordt geschreven als abc, en a (b(c )) als a bc 4/15 18 oktober 2004
Reguliere expressies in de theorie van formele talen (3) Voorbeelden. Laat Σ = {0, 1}. De expressies 00 en 0100100 representeren respectievelijk de verzamelingen {00} en {0100100} De expressies 0 1 en 10 01, representeren respectievelijk de verzamelingen {0, 1} en {10, 01} De expressies 0 en (01) representeren respectievelijk de verzamelingen {ɛ, 0, 00, 000,...} en {ɛ, 01, 0101, 010101,...} De expressie (0 00)1 representeert {0, 00, 01, 001, 011, 0011,...} (0 00)1 = 01 001 5/15 18 oktober 2004
Reguliere expressies in de theorie van formele talen (4) Meer voorbeelden. a b representeert {a, ɛ, b, bb, bbb,...} (a b) representeert de verzameling van alle strings bestaande uit a s en b s, inclusief de lege string b (ab ) idem ab (c ɛ) representeert de verzameling van strings die beginnen met een enkele a, gevolgd door nul of meer b s, en eindigend met optioneel een c 6/15 18 oktober 2004
Reguliere talen De talen die door reguliere expressies kunnen worden gerepresenteerd noemen we de reguliere talen Daarmee corresponderen ze met de zogenaamde type 3 grammatica s in de Chomsky hierarchy Ze zijn minder expressief dan context-vrije grammatica s (CFGs) zoals BNF (Backus-Naur Form) grammatica s Zo kun je bijvoorbeeld in reguliere expressies geen nesting definieren Noot: de syntax van Perl is veel rijker dan die van reguliere expressies; strict genomen zijn de reguliere expressies van Perl niet regulier. Deze expressivieteit kan ten koste gaan van de effectiviteit: worstcase complexiteit van matchen van een string tegen een Perl regex is 7/15 18 oktober 2004
exponentieel in de lengte van de input. (In de praktijk valt dit gelukkig mee.) 8/15 18 oktober 2004
Voorbeeld BNF grammatica <bit> ::= 0 1 <expr> ::= <bit> (<expr> + <expr>) (<expr> * <expr>) Deze BNF grammatica genereert o.a. de strings 0, 1, (0 + 1), (1 * (1 + 1)) Noot: de taal die gegenereerd wordt door deze grammatica is context-vrij, maar niet regulier; je kunt de expressies van deze taal niet met een reguliere expressie karakteriseren 9/15 18 oktober 2004
Unix regexps (1) De volgende syntax is min of meer standaard voor veel Unix tools en programmeertalen. Basisregels: 1. Ieder afdrukbaar ASCII karakter dat geen metakarakter is, is een reguliere expressie die zichzelf representeert. 2.. representeert ieder enkel karakter 3. ˆrepresenteert het begin van een regel 4. $ representeert het einde van een regel 5. \ gevolgd door een metakarakter representeert dat karakter zelf. Dus: \. representeert een punt (.) 10/15 18 oktober 2004
6. [ ] representeert een enkel karakter. Tussen de haken staat een karakterisering. [a] representeert karakter a [abc] representeert karakter a, b, of c [a z] representeert een karakter in de range a z (karakters geordend volgens hun ASCII codering) [A Za z0 9] representeert een cijfer of letter [ˆE] representeert ieder karakter dat niet door [E] gerepresenteerd wordt [acq z] representeert a, c, of een karakter in q z. 11/15 18 oktober 2004
Unix regexps (2) Inductieve regels: Als A en B reguliere expressies zijn, dan 1. AB is een reguliere expressie (concatenatie), 2. A B is een reguliere expressie (keuze/vereniging), 3. A is een reguliere expressie (Kleene star) 4. A+ is een reguliere expressie (één of meer geconcateneerde voorkomens van A) 5. A? is een reguliere expressie (nul of één voorkomens van A) 6. (A) is een reguliere expressie (Perl) 7. \(A\) is een reguliere expressie (vi) 12/15 18 oktober 2004
8. (Perl) A{m, n} voor integers m en n representeert m tot n geconcateneerde voorkomens van A. 9. (Perl) A{m} voor integer m representeert m geconcateneerde voorkomens van A. 10. Concatenatie bindt sterker dan keuze, dus A BC = A (BC) 13/15 18 oktober 2004
Voorbeelden Wat staat hier (perl)? $timestr =~ s/([0-9]+):([0-5][0-9]):([0-5][0-9])/\2 min., \3 sec. after \1/; En hier (vi)? s/\([0-9]+\):\([0-5][0-9]\):\([0-5][0-9]\)/\2 min., \3 sec. after \1/; 14/15 18 oktober 2004
Meer voorbeelden.ap representeert o.a. aap, lap, kap [al]ap representeert aap en lap [ˆa]ap representeert o.a. lap en kap, maar niet aap ˆ[al]ap representeert aap en lap, maar alleen aan het begin van een regel [al]ap$ representeert aap en lap, maar alleen aan het einde van een regel [al]+ap representeert o.a. aap, lap, aaap, alap, laap, llap, etc. [al]?ap representeert ap, aap en lap [aa]ap [nn]oot representeert aap, Aap, noot, en Noot.\.(\( \)) representeert o.a. a.) 15/15 18 oktober 2004