用于模式搜索的DFA是什么?

时间:2013-03-19 00:39:40

标签: regex pattern-matching finite-automata dfa

E.g。正则表达式go*d是一种模式,可匹配gdgodgood等字符串......

你可以想象它的DFA就像一个三态机器。

当它用于模式搜索时,例如给定句子xxxxgodxxxxgoodxxxgo*d的DFA似乎不起作用。甚至字符x在此三态DFA中也未定义。

我们可以想象一个具有额外“重置”状态的4状态DFA可以在这里工作。也就是说,当遇到未定义的字符时,进入“重置”状态。

问题是模式搜索工具如何使用像go*d这样的正则表达式来实现搜索目的?

1 个答案:

答案 0 :(得分:0)

给出了琐碎的三态匹配器

|start|---/g/---+->|S1|-->-+---/d/--->|accept|
                |          |
                +--<-/o/-<-+

您不需要重置状态,而是标记为[^g]的开始状态的全能反身转换。严格遵循dfa定义,您需要|Σ|-1个过渡,每个过渡都标有g以外的一个字母字符。类似地,从标记为S1的{​​{1}}到start以及从[^g]到标记为S1的自身的过渡保证在遇到模式的可能实例化的前缀之后正确'重置'。类似地增强g状态,您将捕获所有非重叠模式实例化(这是该特定模式的所有实例化。

当然,这很快变得比这个玩具示例复杂得多,这就是为什么通常采用标准的正则表达式 - > nfa-> dfa结构。

另一种策略是在没有增强功能的情况下使用原始dfa,并在每次离开accept状态时生成子进程。子进程应用与其父进程相同的dfa,将其应用于给定的句子,从使转换离开启动状态的字符开始。