Op dinsdag 09 oktober 2001 16:55 schreef marcusk het volgende:
Dus de regexp-parsers in PHP bv. zijn NFA als ik het goed begrijp?
De standaard regular expressions in PHP zijn volgens mij POSIX NFA, maar niet helemaal (extended noemen ze het geloof ik).
DFA's vind je ook wel terug in aardig wat tools, maar met een echte DFA kun je eigenlijk alleen zien
of een pattern matched, niet
waar, of
wat. Backreferences (capturing dus) zijn met een echte DFA ook
onmogelijk.
Er zijn ook tools die beiden combineren. Omdat een DFA erg snel kan zien of iets matched wordt die eerst uitgevoerd en als dat zo is wordt een NFA ingezet om meer informatie over de match te krijgen. Er zijn ook geavanceerdere vormen van combinaties van beiden.
Hoe werkt het via DFA dan?
Een DFA compileert eerst de regex in een soort boomstructuur (alle mogelijke paden). Dan wordt de tekst geanaliseerd om te kijken of deze in een van deze paden past. Het compileren duurt even (een NFA 'compileert' ook het pattern, maar lang niet zo uitgebreid en niet te vergelijken), maar dan maakt het verder niet uit hoe je de regex gebouwd hebt. Bijvoorbeeld
/(hooooo|hooo|hoo|ho)/ of
/hoo?o?(oo)?/ maakt voor een DFA qua efficientie absoluut niets uit, heel anders dan bij een NFA (belangrijk is bijvoorbeeld dat een DFA geen backtracking hoeft toe te passen om tot een match te komen, hij houdt gewoon bij welke 'paden' nog 'kunnen').
Maar dit is best wel off-topic

Als je geinteresseerd bent in de theorie is er eigenlijk maar 1 echte aanrader: Mastering Regular Expresssions van Jeffrey Friedl (O'Reilly).
Ik denk dat het vast ergens op het web te vinden is. Ik heb het boek hier liggen, dus met een simpele search op een stukje tekst eruit moet wel een HTML versie te vinden zijn, alleen mag ik
hier waarschijnlijk geen link plaatsen (hint)

Aantal regels code lijkt me niet echt een goed plan

Was ook een mopje

Zijn er nog meer mensen die dit interessant zouden vinden?
Niet zo veel denk ik

Het is misschien ook wel erg complex (maar dat heb je met de opdracht natuurlijk zelf in de hand...)
[edit]
/hooo.../ voorbeeld was niet zo fijn gekozen, omdat de twee natuurlijk niet aan elkaar gelijk zijn

Beter voorbeeld:
/(0|1|2|3|4|10|11|12|13|14)/ en
/1?[0-4]/ maken voor een DFA absoluut geen verschil.