Sim*_*mon 16
技术答案:传统上,egrep在内部使用确定性有限自动机 (DFA) 而grep使用非确定性有限自动机 (NFA)。这些天来,GNUgrep和egrep采用混合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。
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |