正则表达式 - 二进制字符串匹配但不反转时

时间:2013-04-02 22:34:21

标签: regex

首先,很明显这是家庭作业,我相信我已经完成了尽职调查。现在我不希望在银盘上给我一个解决方案,只是在正确方向上的简单推动会很好,所以让我开始吧:

问题是:

  

字母{0,1}上的所有字符串,其中每个奇数长度的块   0后紧跟一个偶数长度的1和1的块   偶数长度为0的块后面紧跟一个奇数长度   1块。

我一直在做的是从头开始一起工作,从:

开始

只匹配0,奇数1: ^[^0]*((00)+1(11)*)*$

只匹配奇数0,即使是1: ^[^0]*(0(00)*(11)+)*$

将它们放在一起: ^[^0]*((00)+1(11)*)*(0(00)*(11)+)*$

我认为这最初有效,但它只适用于:

  • 001011
  • 001000010110001111等
  • 基本上任何其他出现的顺序与出现在表达式中的顺序相同。

而不是:

  • 011001等

我一直坚持的是弄清楚如何让它适用于上面列出的案例。我试着做一个积极的前瞻,但它似乎没有用。

有没有人有任何指示?

2 个答案:

答案 0 :(得分:1)

将它们组合为^[^0]*((00)+1(11)*)*(0(00)*(11)+)*$只能让你获得一半,因为它仅在所有奇数0偶数1块都在所有偶数0奇数1块之前时才有效。你想要的是一个正则表达式,它匹配零个或多个([^0]*),然后是奇偶偶数和偶数奇数块的混合 - 有点像(odd-even|even-odd)(odd-even|even-odd)...,但对于任何数量(零或更多) )奇数偶数或偶数奇数。你怎么能这样做?

答案 1 :(得分:0)

你肯定是在正确的轨道上。

仅匹配0,奇数1:^(00)+1(11)*$

仅匹配奇数0,甚至1:^0(00)*(11)+$

将它们放在一起:^(((00)+1(11)*)|(0(00)*(11)+))+$

只是为了好玩,这是一个较短的输入111111111 ... ...除非你将零数作为偶数。

^((00)*(01)?1(11)*)+$