Respuesta técnica: tradicionalmente, egrep
usaba un autómata finito determinista (DFA) internamente mientras grep
usaba un autómata finito no determinista (NFA). En estos días, GNU grep
y egrep
adoptar un enfoque híbrido NFA / DFA.
Según el libro de Friedl Mastering Regular Expressions , para descubrir si su egrep
(por ejemplo) tiene un motor NFA o si tiene un motor DFA, pruebe:
echo =XX========================================= | egrep 'X(.+)+X'
Freidl (p.147) dice:
Si tarda mucho tiempo en terminar, es un NFA ... Si termina rápidamente, es un DFA o un NFA con alguna optimización avanzada. ¿Muestra un mensaje de advertencia sobre un overow de pila o una coincidencia larga anulada? Si es así, es un NFA.
Friedl describe el motor NFA como "dirigido por expresiones regulares" y el DFA como "dirigido por texto". Los detalles de la distinción se describen a partir de la p.153 de su libro en adelante.
La consecuencia es que hay algunas combinaciones de patrones / texto que un DFA hace coincidir más rápidamente y otras que un NFA hace coincidir más rápidamente. Además, la forma en que escribe una expresión regular para un NFA puede tener un efecto significativo en la velocidad de coincidencia. A menudo, un DFA será más rápido, pero los DFA no admiten la coincidencia diferida, coinciden de manera diferente en algunos casos, no pueden hacer expresiones de búsqueda o referencias inversas, y omiten algunas otras características en comparación con los NFA.
Según Freidl, GNU grep
usa un DFA cuando es posible y vuelve a un NFA cuando se usan referencias inversas .