如果NFA和DFA相同,为什么我们有两个正则表达式的引擎?

时间:2016-03-30 11:26:58

标签: regex dfa nfa

来自掌握正则表达式3e

  

因此,从广义上讲,有三种类型的正则表达式引擎:

     
      
  • DFA(POSIX或不相似的任何一种方式)
  •   
  • 传统的NFA(最常见的:Perl,.NET,PHP,Java,Python,...)
  •   
  • POSIX NFA
  •   

来自计算理论:形式语言,自动机和复杂性

  

对于每个NFA,都有一个接受完全相同语言的DFA。

我可以说NFA和DFA是一回事吗?或者即使他们识别模式的能力相同,但它们在某种程度上仍然不同?

1 个答案:

答案 0 :(得分:1)

你遗漏了两件事:

  1. “传统的NFA”实施实际上包括超出NFA严格的计算机科学定义的能力。

  2. 性能特征是一件值得关注的事情,即使有两个实现涵盖相同的答案。

  3. 净效果是回溯实现(我喜欢这个名称比“传统NFA”更好)比DFA实现更具表现力,因为它们可以匹配像(\w{3,})\1这样的正则表达式,它匹配重复的三个或更多单词字符两次(DFA无法匹配的东西)。同时,DFA实现在输入长度上保证为O(n),但是当用不匹配的字符串表示时,很容易编写具有O(n ^ 2)或更差行为的正则表达式。 (见https://swtch.com/~rsc/regexp/regexp1.html