二进制字符串的正则表达式,具有一对连续的0和一对连续的1

时间:2017-02-03 20:31:58

标签: regex regular-language

1*(011*)*00(11*0)* 1* intersect 0*(100*)*11(00*1)* 0*

正则表达式的前半部分应匹配具有一对连续0的所有二进制字符串,而后半部分应匹配具有一对连续1的所有二进制字符串。由于第一个包含一对连续1的字符串,第二个包含一对连续0的字符串,我声称整个正则表达式只匹配二进制字符串,最多一个连续的0对和一个连续的1对。它是否正确?

1 个答案:

答案 0 :(得分:0)

是的,但更准确地说,你的表达式匹配二进制字符串,它只包含一对0和一对1(而不是“最多”)。

我可以通过这种方法证明:

这是另一个使用联合而不是交集来编码那些语义的正则表达式,我觉得它更直接。

(1)?(01)*00(10)*11(01)*(0)?|(0)?(10)*11(01)*00(10)*(1)?

前半部分匹配二进制字符串,其中该对0在该对1之前,而后半部分匹配二进制字符串,其中该对字符串在该对0之前。在这些对之前,之后和之间可能会出现交替值。

如果字符串与这些模式中的任何一个匹配(而不是表达式中的两个模式),则接受该字符串。

现在,可以基于这些正则表达式之一构造状态转换。我已经在下面这样做了,首先是我的,然后是你的。每个编号状态都包含一个正则表达式列表,用于描述字符串的剩余部分,以及遇到0,1或行尾时发生的状态转换。如果字符串匹配列表中的任何正则表达式,则该字符串匹配。

正如您所看到的,您的版本与我的版本之间的状态转换是完全同源的。因此,它们代表完全相同的字符串集。

start    (1)?(01)*00(10)*11(01)*(0)?
         (0)?(10)*11(01)*00(10)*(1)?
     0    1
     1    2
     EOL    NO_MATCH
1        1(01)*00(10)*11(01)*(0)?
         0(10)*11(01)*(0)?
         (10)*11(01)*00(10)*(1)?
     0    3
     1    2
     EOL    NO_MATCH
2        (01)*00(10)*11(01)*(0)?
         0(10)*11(01)*00(10)*(1)?
         1(01)*00(10)*(1)?
     0    1
     1    4
     EOL    NO_MATCH
3        (10)*11(01)*(0)?
     0    NO_MATCH
     1    5
     EOL    NO_MATCH
4        (01)*00(10)*(1)?
     0    6
     1    NO_MATCH
     EOL    NO_MATCH
5        0(10)*11(01)*(0)?
         1(01)*(0)?
     0    3
     1    7
     EOL    NO_MATCH
6        1(01)*00(10)*(1)?
         0(10)*(1)?
     0    8
     1    4
     EOL    NO_MATCH
7        (01)*(0)?
     0    9
     1    NO_MATCH
     EOL    MATCH
8        (10)*(1)?
     0    NO_MATCH
     1    10
     EOL    MATCH
9        1(01)*(0)?
     END
     0    NO_MATCH
     1    7
     EOL    MATCH
10       0(10)*(1)?
     END
     0    8
     1    NO_MATCH
     EOL    MATCH

start    1*(011*)*00(11*0)*1* + 0*(100*)*11(00*1)*0*
     0    1
     1    2
     EOL    NO_MATCH
1        11*(011*)*00(11*0)*1* + 0*(100*)*11(00*1)*0*
         0(11*0)*1* + 0*(100*)*11(00*1)*0*
     0    3
     1    2
     EOL    NO_MATCH
2        1*(011*)*00(11*0)*1* + 00*(100*)*11(00*1)*0*
         1*(011*)*00(11*0)*1* + 1(00*1)*0*
     0    1
     1    4
     EOL    NO_MATCH
3        (11*0)*1* + 0*(100*)*11(00*1)*0*
     0    NO_MATCH
     1    5
     EOL    NO_MATCH
4        1*(011*)*00(11*0)*1* + (00*1)*0*
     0    6
     1    NO_MATCH
     EOL    NO_MATCH
5        1*0(11*0)*1* + 00*(100*)*11(00*1)*0*
         (11*0)*1* + 00*(100*)*11(00*1)*0*
         1*0(11*0)*1* + 1(00*1)*0*
         (11*0)*1* + 1(00*1)*0*
     0    3
     1    7
     EOL    NO_MATCH
6        11*(011*)*00(11*0)*1* + 0*1(00*1)*0*
         0(11*0)*1* + 0*1(00*1)*0*
         11*(011*)*00(11*0)*1* + 0*
         0(11*0)*1* + 0*
     0    8
     1    4
     EOL    NO_MATCH
7        1*0(11*0)*1* + (00*1)*0*
         1* + (00*1)*0*
     0    9
     1    NO_MATCH
     EOL    MATCH
8        (11*0)*1* + 0*1(00*1)*0*
         (11*0)*1* + 0*
     0    NO_MATCH
     1    10
     EOL    MATCH
9        (11*0)*1* + 0*1(00*1)*0*
         (11*0)*1* + 0*
     0    NO_MATCH
     1    7
     EOL    MATCH
10       1*0(11*0)*1* + (00*1)*0*
         1* + (00*1)*0*
         (11*0)*1* + 0*
     0    8
     1    NO_MATCH
     EOL    MATCH