Technische Antwort: Traditionell egrep
wird ein deterministischer finiter Automat (DFA) intern verwendet, während grep
ein nicht deterministischer finiter Automat (NFA) verwendet wird. In diesen Tagen, GNU grep
und egrep
einen hybriden NFA / DFA-Ansatz.
Laut Friedls Buch Mastering Regular Expressions können Sie herausfinden, ob Ihre egrep
NFA-Engine (z. B.) über eine NFA-Engine oder eine DFA-Engine verfügt:
echo =XX========================================= | egrep 'X(.+)+X'
Freidl (S.147) sagt:
Wenn es lange dauert, bis es fertig ist, ist es ein NFA ... Wenn es schnell fertig wird, ist es entweder ein DFA oder ein NFA mit einigen fortschrittlichen Optimierungen. Zeigt es eine Warnmeldung an, wenn ein Stack-Overow oder ein langer Match abgebrochen wurde? Wenn ja, ist es eine NFA.
Friedl bezeichnet die NFA-Engine als "regex-gerichtet" und die DFA als "textgesteuert". Die Einzelheiten der Unterscheidung werden ab S.153 seines Buches beschrieben.
Die Folge ist, dass es einige Muster / Text-Kombinationen gibt, die von einem DFA schneller abgeglichen werden, und andere, die von einem NFA schneller abgeglichen werden. Die Art und Weise, wie Sie einen Regex für einen NFA schreiben, kann die Geschwindigkeit des Abgleichs erheblich beeinflussen. Häufig ist ein DFA schneller, aber DFAs unterstützen kein Lazy-Matching. In einigen Fällen passen sie anders zusammen. Sie können keine Ausdrücke oder Rückverweise verwenden und lassen im Vergleich zu NFAs einige andere Funktionen aus.
Laut Freidl grep
verwendet GNU wenn möglich einen DFA und kehrt bei Verwendung von Rückverweisen zu einem NFA zurück.