Resposta técnica: tradicionalmente, egrep
usava um autômato finito determinístico (DFA) internamente, enquanto grep
usava um autômato finito não determinístico (NFA). Atualmente, o GNU grep
e o egrep
adotam uma abordagem híbrida de NFA / DFA.
De acordo com o livro de Friedl Mastering Regular Expressions , para descobrir se o seu egrep
(por exemplo) tem um Motor NFA ou se tiver um mecanismo DFA, tente:
echo =XX========================================= | egrep 'X(.+)+X'
Freidl (p.147) diz:
If it takes a long time to finish, it's an NFA ... If it finishes quickly, it's either a DFA or an NFA with some advanced optimization. Does it display a warning message about a stack overow or long match aborted? If so, it's an NFA.
Friedl descreve o mecanismo NFA como "dirigido por regex" e o DFA como "dirigido por texto". Os detalhes da distinção são descritos da p.153 do seu livro em diante.
A consequência é que existem algumas combinações de padrão / texto que são correspondidas mais rapidamente por um DFA e algumas que são correspondidas mais rapidamente por um NFA. Além disso, a maneira como você escreve um regex para um NFA pode ter um efeito significativo na velocidade de correspondência. Geralmente, um DFA é mais rápido, mas os DFAs não oferecem suporte a lazy matching, eles são diferentes em alguns casos, não podem fazer expressões de referência ou referências anteriores e omitem alguns outros recursos em comparação com os NFAs.
De acordo com Freidl, o GNU grep
usa um DFA quando possível e reverte para um NFA quando referências anteriores são usadas.