Se le espressioni regolari non sono banali singole corde, e la cura per l'efficienza, che ci si vuole rappresentare in un unico NFA (nondeterministic finite-state automaton, con valori in stati finali. Se è possibile che un input corrisponda a più di una regexp, gli stati finali necessitano di un set di valori.
A questo punto, siete pronti a prendere in considerazione l'ottimizzazione dell'automa. Se può essere praticamente determinato (questo ti dà un DFA che può essere esponenzialmente più grande del NFA), allora con tutti i mezzi farlo. Una volta che si dispone di un DFA, è possibile ridurlo in modo efficiente (e in modo univoco fino all'isomorfismo) (ma poiché si hanno valori negli stati finali, è necessaria una modifica evidente di usual algorithm).
Esistono anche tecniche per minimizzare direttamente NFA. Ad esempio, se due stati hanno gli stessi suffissi set ({resto della stringa, valore)}) sono equivalenti e possono essere combinati. L'equivalenza in un NFA aciclico può essere effettuata tramite hash-consing a partire dagli stati finali.
fonte
2009-09-10 23:07:48
In base alle risposte ricevute, è possibile fornire ulteriori dettagli nella domanda relativa alla propria particolare applicazione. –
Circa quante espressioni ci sono in una tonnellata? Quanto è grande il testo che corrisponderanno? Con quale frequenza verrà fornito un nuovo testo? Quanto velocemente devono essere restituiti i risultati? – TrueWill