如果 grep 优于 egrep,有什么优势

MYV*_*MYV 4 linux unix grep egrep

我只是在学习 grep 系列程序,在我看来 egrep 完全优于 grep - 它可以做 grep 可以做的一切,但更多。我错了吗?为什么不每次都使用 egrep?

编辑:我知道 grep -E 与 egrep 相同。我想知道为什么 grep -E 不是 grep 的默认模式,因为它只会扩展其可用性并且没有明显的缺点。

Sim*_*mon 16

技术答案:传统上,egrep在内部使用确定性有限自动机 (DFA) 而grep使用非确定性有限自动机 (NFA)。这些天来,GNUgrepegrep采用混合NFA / DFA的方法。

根据 Friedl 的书Mastering Regular Expressions,要发现您的egrep(例如)是否有 NFA 引擎或是否有 DFA 引擎,请尝试:

echo =XX========================================= | egrep 'X(.+)+X'
Run Code Online (Sandbox Code Playgroud)

Freidl (p.147) 说:

如果需要很长时间才能完成,则它是 NFA……如果它很快完成,则它要么是 DFA,要么是经过一些高级优化的 NFA。它是否显示有关堆栈溢出或长匹配中止的警告消息?如果是这样,那就是NFA。

Friedl 将 NFA 引擎描述为“正则表达式导向”,将 DFA 描述为“文本导向”。从他的书的第 153 页开始描述了区别的细节。

结果是有一些模式/文本组合被 DFA 匹配得更快,而另一些则被 NFA 匹配得更快。此外,您为 NFA 编写正则表达式的方式会对匹配速度产生重大影响。通常,DFA 会更快,但 DFA 不支持延迟匹配,在某些情况下它们的匹配方式不同,它们不能执行环视表达式或反向引用,并且与 NFA 相比,它们省略了一些其他功能。

根据 Freidl 的说法,GNUgrep在可能的情况下使用 DFA,并在使用反向引用时恢复为 NFA。