以下哪个正则表达式表示可被 3 整除的所有二进制数的集合?假设字符串ϵ 可以被 3 整除。
(A) (0+1(01*0)*1)*
(B) (0+11+10(1+00)*01)*
(C) (0*(1(01*0)*1)*)*
(D) (0+11+11(1+00)*00)*答案: (A) (B) (C)
说明:可被 3 整除的二进制数分为 3 类:
有两个连续的 1 或两个 1 被偶数个 0 分隔的数字。实际上,每一对都“取消”了自己。
(例如 11, 110, 1100,1001,10010, 1111)
(十进制:3、6、12、9、18、15)
三个 1 由奇数个 0 分隔的数字。这些三胞胎也“取消”了自己。
(例如 10101、101010、1010001、1000101)
(十进制:21、42、81、69)
前两条规则的某种组合(包括彼此内部)
(例如 1010111、1110101、1011100110001)
(十进制:87、117、5937)
因此,考虑到这三个规则的正则表达式很简单:
0*(1(00)*10*|10(00)*1(00)*(11)*0(00)*10*)*0*
这个问题的测验