来自掌握正则表达式3e :
因此,从广义上讲,有三种类型的正则表达式引擎:
- DFA(POSIX或不相似的任何一种方式)
- 传统的NFA(最常见的:Perl,.NET,PHP,Java,Python,...)
- POSIX NFA
来自计算理论:形式语言,自动机和复杂性:
对于每个NFA,都有一个接受完全相同语言的DFA。
我可以说NFA和DFA是一回事吗?或者即使他们识别模式的能力相同,但它们在某种程度上仍然不同?
答案 0 :(得分:1)
你遗漏了两件事:
“传统的NFA”实施实际上包括超出NFA严格的计算机科学定义的能力。
性能特征是一件值得关注的事情,即使有两个实现涵盖相同的答案。
净效果是回溯实现(我喜欢这个名称比“传统NFA”更好)比DFA实现更具表现力,因为它们可以匹配像(\w{3,})\1
这样的正则表达式,它匹配重复的三个或更多单词字符两次(DFA无法匹配的东西)。同时,DFA实现在输入长度上保证为O(n),但是当用不匹配的字符串表示时,很容易编写具有O(n ^ 2)或更差行为的正则表达式。 (见https://swtch.com/~rsc/regexp/regexp1.html)