正则表达式,描述{0,1}的语言,没有交替的0

时间:2011-05-02 02:34:30

标签: regex language-agnostic

它主要在标题中,我的意思是交替是在两次出现的0之间存在单个1或0。所以没有出现 0 1 0 0 0 0

我试图理解问题的理论性质,所以我更喜欢连接,连接和闭包(10,1 | 0和10 *)。

请注意这是 NOT 一个我刚才对这个问题感兴趣的作业问题,所以请不要光顾那些影响的评论。

编辑:将第一段中的措辞从“ 出现次数”更改为“两次出现之间”。

1 个答案:

答案 0 :(得分:5)

第一个重要的观察是我们可以减少问题:如果S被允许并且是1或以两个结束,则S与任何允许的序列连接仍然是允许的。那么是什么使得有效的S?

  1. 1显式位于S中,任何多个1的序列将始终以11结尾,因此位于S中。
  2. 01可能只会跟随另一个1,因为0010。这以11结束,因此是有效的S.
  3. 00后面只能跟11000000010010都有交替的零。这以11结束,因此是有效的S.
  4. 这告诉我们任何S匹配^(1|011|0011)*$。但是我们没有完成,因为有一些其他序列对S无效但是它们本身是允许的序列,因此可以连接到S。

    • 0
    • 00
    • 01
    • 001
    当然,

    000是不被允许的,而且任何更长的要么是在S中,要么本身是不允许的。

    所以整个正则表达式匹配允许的序列是:

    ^(1|011|0011)*(|0|00|01|001)$
    

    这是零个或多个S序列,可选地随后是我们允许的非S序列之一。