Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 构建正则表达式和有限自动机_Regex_Automata - Fatal编程技术网

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

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

我需要一些帮助来理解如何使用下面的内容来生成一个正则表达式,该正则表达式将用于生成epsilon NFA

字母表是{0,1}

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

有效字符串应为:

^(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不正确匹配。。。