如果 NFA 和 DFA 是等价的,为什么我们会有两个正则表达式引擎?

If NFA and DFA were equivalent, why would we have two engines for regex?

来自掌握正则表达式3e:

As a result, broadly speaking, there are three types of regex engines:

  • DFA (POSIX or not—similar either way)
  • Traditional NFA (most common: Perl, .NET, PHP, Java, Python, . . . )
  • POSIX NFA

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

For each NFA, there is a DFA that accepts exactly the same language.

我能说 NFA 和 DFA 是一回事吗?或者即使他们识别模式的能力相当,但他们在某些方面仍然不同?

您缺少两件事:

  1. "traditional NFA" 实现实际上包括超出 NFA 的严格计算机科学定义的能力。

  2. 性能特征是一个值得关注的问题,即使给出两个涵盖相同答案的实现也是如此。

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