构造一个正则表达式以匹配以下语言

时间:2016-10-03 06:29:11

标签: regex finite-automata deterministic

我正在做一个由教授在讲座结束时发表的思考练习。问题是在给定特定语言定义的情况下构造DFA。在构建DFA之前,第一个思考练习是将语言定义转换为正则表达式。

提供的字母表是二进制{0,1}

语言定义非常非正式:

  

定义二进制字符串集的语言,其中每个长度为3的子字符串至少有一个零

因此,与此定义匹配的字符串示例包括0000011010等等。

我的麻烦是提出一个正则表达式来匹配这个语言定义。我尝试在http://regexr.com/上玩,但我只发现了' ... 0'匹配每三个字符,最后为零。我不确定如何以定义语言的方式匹配每个子字符串,或者甚至是否可能。

有没有办法为这个问题构造正则表达式?

1 个答案:

答案 0 :(得分:3)

需要横向思维。不要为非正式语言定义实现正则表达式,而是针对该定义所暗示的属性。

扰流板(将鼠标悬停在解决方案上):

提示1:

  

如果任意3个长度的子字符串必须有0个数字,那么连续3个数字就不可能是1 - 个数字。

提示2:

  

这意味着在每个0个数字之间,最多有2个1个数字。

提示3:

  

这使得它成为一种语言,在0-2 1 - 数字之后,可能会有无限数量的组由0 - 数字和0-2 1 - 数字组成

解决方案:

  

^1{0,2}(01{0,2})*$,或等效且更具数学性,^(11?)?(0(11?)?)*$