如果NFA和DFA是等效的,为什么我们要为regex配备两个引擎?
从掌握正则表达式3e开始: 因此,广义而言,有三种类型的正则表达式引擎:如果NFA和DFA是等效的,为什么我们要为regex配备两个引擎?,regex,dfa,nfa,Regex,Dfa,Nfa,从掌握正则表达式3e开始: 因此,广义而言,有三种类型的正则表达式引擎: DFA(POSIX或两种方式不类似) 传统的NFA(最常见的:Perl、.NET、PHP、Java、Python等) POSIX NFA 根据计算理论:形式语言、自动机和复杂性: 对于每个NFA,都有一个接受完全相同语言的DFA 我能说NFA和DFA是一回事吗?或者,尽管它们识别模式的能力相当,但它们在某些方面仍然不同?您缺少两件事: “传统的NFA”实现实际上包括NFA的严格计算机科学定义之外的能力 性能特性是一个需
- DFA(POSIX或两种方式不类似)
- 传统的NFA(最常见的:Perl、.NET、PHP、Java、Python等)
- POSIX NFA
我能说NFA和DFA是一回事吗?或者,尽管它们识别模式的能力相当,但它们在某些方面仍然不同?您缺少两件事:
最终的效果是回溯实现(我更喜欢这个名字,而不是“传统的NFA”)比DFA实现更具表现力,因为它们可以匹配正则表达式,比如
(\w{3,})\1
,它匹配三个或更多重复两次的单词字符(DFA无法匹配)。同时,DFA实现在输入长度上保证为O(n),但当使用不匹配的字符串表示时,很容易编写具有O(n^2)或更糟糕行为的正则表达式。(请参阅)您可以构造接受相同语言的DFA,这并不意味着它们“相同”。它们的操作方式不同,这就是它们的不同之处。请参见此处:读取的可能重复