构建正则表达式和有限自动机

时间:2014-03-13 00:08:08

标签: regex automata

我需要一些帮助,了解如何使用以下内容制作将用于生成epsilon NFA的正则表达式。

字母是{0,1}

语言是:所有字符串的集合,以101开头,以01010结尾。

有效字符串为:

  • 101010
  • 10101010
  • 101110101
  • 1011101010

我更关心如何制作正则表达式。

3 个答案:

答案 0 :(得分:5)

您需要的正则表达式非常简单:

101010|101(0|1)*01010 (theoretical)

^101010|101[01]*01010$ (used in most programming languages)

这意味着:

  • 匹配1,0,1,0,1,0

  • 匹配1,0和1。
  • 保持匹配0或1,零次或多次。
  • 匹配0,1,0,1,0。

以下非确定性自动机应该有效:

enter image description here

答案 1 :(得分:1)

要了解您要查找的内容,使用交叉点运算符(在下面表示为&)是有帮助的。它不属于理性表达的核心集合,但它保留了理性 - 换句话说,你可以使用它,并且总是找到一种表达相同语言的手段。

使用Vcsn,我在文本模式下得到了这个:

In [1]: import vcsn

In [2]: vcsn.B.expression('(101[01]*)&([01]*01010)').derived_term().expression()
Out[2]: 101010+101(0+1)*01010

这是在图形模式下,显示使用derived_term计算的中间自动机(其中包含有关每个状态的“含义”的详细信息,因此strip之后调用以获得更简单的内容):< / p>

Graphical rendering of the automaton

答案 2 :(得分:0)

我建议的模式包括基本案例和一般案例。您需要覆盖101010的基本情况,其中两个图案重叠(以“101”开头,以“01010”结尾,第一个图案的最后两位数字是第二个图案的前两位数。然后您可以涵盖一般情况“101”,任何0或1,“01010”,由奥斯卡提供。

所以完整的模式是:

^(101010|(101[01]*01010))$