繁体   English   中英

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

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

掌握正则表达式 3e

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

  • DFA(POSIX 与否 - 类似)
  • 传统 NFA(最常见:Perl、.NET、PHP、Java、Python、..)
  • POSIX NFA

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

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

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

你缺少两件事:

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

  2. 性能特征是一件需要关心的事情,即使给出了涵盖相同答案的两个实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM