我需要一些帮助,了解如何使用以下内容制作将用于生成epsilon NFA的正则表达式。
字母是{0,1}
语言是:所有字符串的集合,以101开头,以01010结尾。
有效字符串为:
我更关心如何制作正则表达式。
答案 0 :(得分:5)
您需要的正则表达式非常简单:
101010|101(0|1)*01010 (theoretical)
或
^101010|101[01]*01010$ (used in most programming languages)
这意味着:
或
以下非确定性自动机应该有效:
答案 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>
答案 2 :(得分:0)
我建议的模式包括基本案例和一般案例。您需要覆盖101010的基本情况,其中两个图案重叠(以“101”开头,以“01010”结尾,第一个图案的最后两位数字是第二个图案的前两位数。然后您可以涵盖一般情况“101”,任何0或1,“01010”,由奥斯卡提供。
所以完整的模式是:
^(101010|(101[01]*01010))$