如何从状态图中导出RegEx?

时间:2017-12-18 15:29:27

标签: regex state-diagram

我在脚本中找到了一个DFA(确定性有限自动机)的状态图及其RegEx,但这个图只是一个没有任何解释的示例。所以我试图自己从DFA状态图中导出RegEx并获得表达式:ab+a+b(a*b)*。我不明白我是如何得到脚本中提到的原始RegEx (ab+a*)+ab+的。在这里我的推导:

enter image description here

我很感激任何帮助,链接,参考和提示!

1 个答案:

答案 0 :(得分:2)

您在这里正确地派生了正则表达式。您拥有ab+a+b(a*b)*的表达式相当于(ab+a*)+ab+ - 一旦您完成了DFA状态消除(您从启动状态到接受状态只有一次转换),就不会有(ab+a*)+ab+。任何更多的派生。但是,根据您消除状态的顺序,您可能会获得不同的最终正则表达式,并且假设您正确执行了抵销,它们都应该有效。状态消除方法也不能保证能够为特定DFA生成所有等效的正则表达式,因此您没有完全达到原始正则表达式。你也可以check the equivalence of two regular expressions here

对于您的特定示例,虽然要显示此DFA与此原始正则表达式(ab+a*)+ab+相同,但请查看此消除状态下的DFA(在第二步和第三步之间的某个位置'如上所示):

enter image description here

让我们将表达式(ab+a*)(ab+a*)*ab+扩展为(ab+a*)。因此,在DFA中,第一个a*让我们从状态0到状态2和3之间的中途(a*a中的(ab+a*)*)。

然后下一部分(ab+a*)表示我们允许拥有0个或更多ab+个副本。如果有0份副本,我们将以a完成,从a*a过渡的后半部分读取b,从2到3和{{1}从3到4过渡,让我们处于接受的状态4,我们可以在这里接受自我循环,并根据需要阅读尽可能多的b

否则,我们会有一份或多份(ab+a*)的副本,再次从a过渡的后半部分读取a*a,从{2}转换为b 3到4过渡。 a*来自状态4的a*ab自循环的前半部分,而后半部分ab来自正则表达式的最终ab+或另一个副本的开头(ab+a*)。我不确定状态消除是否恰好达到了(ab+a*)+ab+的表达式,但是对于它的价值,我认为你得到的正则表达式更清楚地捕获了这个DFA的结构。