我正在做一个由教授在讲座结束时发表的思考练习。问题是在给定特定语言定义的情况下构造DFA。在构建DFA之前,第一个思考练习是将语言定义转换为正则表达式。
提供的字母表是二进制{0,1}
语言定义非常非正式:
定义二进制字符串集的语言,其中每个长度为3的子字符串至少有一个零
因此,与此定义匹配的字符串示例包括000
,001
,1010
等等。
我的麻烦是提出一个正则表达式来匹配这个语言定义。我尝试在http://regexr.com/上玩,但我只发现了' ... 0'匹配每三个字符,最后为零。我不确定如何以定义语言的方式匹配每个子字符串,或者甚至是否可能。
有没有办法为这个问题构造正则表达式?
答案 0 :(得分:3)
需要横向思维。不要为非正式语言定义实现正则表达式,而是针对该定义所暗示的属性。
扰流板(将鼠标悬停在解决方案上):
提示1:
如果任意3个长度的子字符串必须有
0
个数字,那么连续3个数字就不可能是1
- 个数字。
提示2:
这意味着在每个
0
个数字之间,最多有2个1
个数字。
提示3:
这使得它成为一种语言,在0-2
1
- 数字之后,可能会有无限数量的组由0
- 数字和0-21
- 数字组成
解决方案:
^1{0,2}(01{0,2})*$
,或等效且更具数学性,^(11?)?(0(11?)?)*$