.*foo
Accademicamente, questa è un'espressione regolare. Una stringa aaaaaaaaaaaaafoo
corrisponderà a quella. Anche la stringa aaaaaaaaaaaaafooaaaaafoo
corrisponderà anche a quella.
Immagino che un NFA che risolve abbia 4 stati. Lo stato 0 avrà una freccia che torna a se stessa. Quindi una freccia passa allo stato 1, o allo stato 2 e un altro o allo stato 3.
L'NFA manterrà il ciclo fino allo stato 0 prima che utilizzi magicamente il suo potere psichico per decidere aha, ora inizierò a cercare il foo. Tuttavia, ho difficoltà a capire il computer psichico.
Quale sarebbe un DFA? Immagino che il numero di stato sia probabilmente di 6. Quindi un DFA può contenere una variabile booleana, sia che tu stia ancora eseguendo il ciclo o se stia ancora procedendo. Non riesco ancora a capirlo. Quindi qualcuno può aiutarmi a costruire un DFA per questo?
Anche .*foo
, ed è variante .*?foo
e .*+foo
sono espressioni regolari attuali usate oggigiorno in senso non accademico.
In che modo un vero motore regex implementerà queste 3 espressioni? Quanto sono vicine quelle effettive implementazioni al DFA effettivo? Voglio dire, so che i veri DFA non guardano indietro. So anche che il vero motore regex guarda avanti e indietro.
Per motivi di semplicità, supponiamo che DFA contenga variabili anziché solo stati. Penso che gli stati di DFA siano comunque variabili nei ricordi.