我有字母{0,1},我想找到正则表达式(0 + 10)*描述的语言的补充。据我所知,它必须是一个包含除“10”部分之外的任何字符串的字符串,即它可以是空字符串,或包含“00”,“01”或“11”的字符串以及这些字符串的每个组合。我正在遵循的教程给出了这些可能无法解决的解决方案:
1) (0+1)*11(0+10)* + (0+1)*1
2) (0+1)*11(0+10)* + (0+10)*1
3) (0+1)*(1+11)(0+1)*
4) (0+10)*11(0+10)*
我已经完成了e-NFA,DFA的过程,并回到正则表达式,可以在这里看到:e-NFA, DFA and complemented DFA
由1,2,3和4给出:
1 = {B, C, D, E}
2 = {B, C, D, E, F, H}
3 = {I}
4 = {B, C, D, E, G, H}
这给了我以下补充的正则表达式,它似乎不是上面的1到4附近:
(1+00*1)*(0(1+00*1))* = 0(1+00*1)
我希望有人能澄清一下。提前致谢, 学家
答案 0 :(得分:0)
因此,一般来说,您必须通过确定性有限自动机来补充正则表达式。 (见this question。)但你可以通过这里的检查来做到这一点。
正则表达式^(0+10)*$
匹配空字符串以及以0
开头的所有其他二进制字符串,以10
结尾,并且在任意对之间至少有两个0
s 1
的。{ (我假设正则表达式是要锚定的;如果它匹配包含匹配的所有字符串,这将成为一个更难的问题。)
因此,补语仅包含以1
开头,以1
或00
结尾的非空二进制字符串,或包括11
或101
的任何位置他们。这是将其编码为正则表达式的一种方法:
(^1|(1|00)$|10?1)
但毫无疑问,更简单的方法。