Regex 构建正则表达式和有限自动机
我需要一些帮助来理解如何使用下面的内容来生成一个正则表达式,该正则表达式将用于生成epsilon NFA 字母表是{0,1} 语言是:以101开头,以01010结尾的所有字符串的集合 有效字符串应为:Regex 构建正则表达式和有限自动机,regex,automata,Regex,Automata,我需要一些帮助来理解如何使用下面的内容来生成一个正则表达式,该正则表达式将用于生成epsilon NFA 字母表是{0,1} 语言是:以101开头,以01010结尾的所有字符串的集合 有效字符串应为: ^(101010|(101[01]*01010))$ 101010 10101010 101110101 1011101010 我更关心的是如何制作正则表达式。您需要的正则表达式非常简单: 101010|101(0|1)*01010 (theoretical) 或 这意味着: 匹配1,0
^(101010|(101[01]*01010))$
- 101010
- 10101010
- 101110101
- 1011101010
我更关心的是如何制作正则表达式。您需要的正则表达式非常简单:
101010|101(0|1)*01010 (theoretical)
或
这意味着:
- 匹配1,0,1,0,1,0
- 匹配1、0和1
- 保持匹配0或1,零次或多次
- 匹配0,1,0,1,0
您需要的正则表达式非常简单:
101010|101(0|1)*01010 (theoretical)
或
这意味着:
- 匹配1,0,1,0,1,0
- 匹配1、0和1
- 保持匹配0或1,零次或多次
- 匹配0,1,0,1,0
我建议一种模式,既包括基本情况,也包括一般情况。您需要覆盖基本情况101010,其中两个模式重叠(以“101”开始,以“01010”结束),第一个模式的最后两位是第二个模式的前两位。然后您可以覆盖一般情况下的“101”,任何0或1,“01010”,如Oscar所示 因此,整个模式将是:
^(101010|(101[01]*01010))$
我建议一个模式,它包括基本情况和一般情况。你需要覆盖101010的基本情况,其中两个模式重叠(以“101”开始,以“01010”结束),第一个模式的最后两位是第二个模式的前两位。然后你可以覆盖“101”的一般情况,任何0或1,“01010”,由奥斯卡给出 因此,整个模式将是:
^(101010|(101[01]*01010))$
为了了解你在寻找什么,使用交集操作符(如下所示)是很有帮助的。它不属于理性表达式的核心集合,但它保留了理性——换言之,你可以使用它,并且总能找到一种不用它表达同一种语言的方法 使用,我在文本模式下得到:
In [1]: import vcsn
In [2]: vcsn.B.expression('(101[01]*)&([01]*01010)').derived_term().expression()
Out[2]: 101010+101(0+1)*01010
这在图形模式下,显示了使用派生的\u术语计算的中间自动机(其中包括关于每个状态的“含义”的详细信息,因此随后调用strip
,以获得更简单的阅读):
为了了解你在寻找什么,使用交集运算符(如下所示)是很有帮助的。它不属于理性表达式的核心集合,但它保留了理性——换言之,你可以使用它,并且总能找到一种不用它表达同一种语言的方法
使用,我在文本模式下得到:
In [1]: import vcsn
In [2]: vcsn.B.expression('(101[01]*)&([01]*01010)').derived_term().expression()
Out[2]: 101010+101(0+1)*01010
这在图形模式下,显示了使用派生的\u术语计算的中间自动机(其中包括关于每个状态的“含义”的详细信息,因此随后调用strip
,以获得更简单的阅读):
问题中没有指定语言,但是您确定(0+1)*
部分吗?为什么不[01]*
?@beroe我的意思是|
,我使用了很久以前在编译器课程中学习的语法,我相信这是正式的定义,其中+
或|
意味着一个联合。当然,在大多数编程语言中,它被表示为[01]*
,正如您所指出的。检查现在看起来很好。您可能还希望在开始和结束时使用^
和$
来锚定它,因为当前查询将再次匹配54321010101012345
@beroe,我指的是理论正则表达式,而这不是必需的,因为在创建自动机时指定初始状态q_0
和一组最终状态(在本例中,只有一个状态:
)当OP提到字母表、语言、自动机等时,我假设他在谈论理论正则表达式。嗨。理论的东西我不懂;我只是在实际世界中操作,但无约束搜索项也可能与状态0,1不正确匹配,如果它以111111开头…语言没有在e问题,但您确定(0+1)*
部分吗?为什么不[01]*
?@beroe我的意思是|
,我使用了很久以前在编译器课程中学习的语法,我相信这是正式的定义,其中+
或|
意味着一个联合。当然,在大多数编程语言中,它被表示为[01]*
,正如您所指出的。检查现在看起来很好。您可能还希望在开始和结束时使用^
和$
来锚定它,因为当前查询将再次匹配54321010101012345
@beroe,我指的是理论正则表达式,而这不是必需的,因为在创建自动机时指定初始状态q_0
和一组最终状态(在本例中,只有一个状态:
)。当OP提到字母表、语言、自动机等时,我假设他在谈论理论正则表达式。嗨。理论的东西超出了我的理解范围;我只是在实际世界中操作,但如果无约束搜索项以111111开头,它也可能只与状态0,1不正确匹配。。。