E.g。正则表达式go*d
是一种模式,可匹配gd
,god
,good
等字符串......
你可以想象它的DFA就像一个三态机器。
当它用于模式搜索时,例如给定句子xxxxgodxxxxgoodxxx
,go*d
的DFA似乎不起作用。甚至字符x
在此三态DFA中也未定义。
我们可以想象一个具有额外“重置”状态的4状态DFA可以在这里工作。也就是说,当遇到未定义的字符时,进入“重置”状态。
问题是模式搜索工具如何使用像go*d
这样的正则表达式来实现搜索目的?
答案 0 :(得分:0)
给出了琐碎的三态匹配器
|start|---/g/---+->|S1|-->-+---/d/--->|accept|
| |
+--<-/o/-<-+
您不需要重置状态,而是标记为[^g]
的开始状态的全能反身转换。严格遵循dfa定义,您需要|Σ|-1
个过渡,每个过渡都标有g
以外的一个字母字符。类似地,从标记为S1
的{{1}}到start
以及从[^g]
到标记为S1
的自身的过渡保证在遇到模式的可能实例化的前缀之后正确'重置'。类似地增强g
状态,您将捕获所有非重叠模式实例化(这是该特定模式的所有实例化。
另一种策略是在没有增强功能的情况下使用原始dfa,并在每次离开accept
状态时生成子进程。子进程应用与其父进程相同的dfa,将其应用于给定的句子,从使转换离开启动状态的字符开始。