二进制数的正则表达式可被5整除

时间:2015-12-26 23:47:22

标签: regex binary division

我想写一个可被5整除的二进制数的正则表达式。
我已经完成了二进制数的正则表达式,可以被2和3整除,但是我找不到5个。

有什么建议吗?

3 个答案:

答案 0 :(得分:20)

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

添加^$以使用regexp对其进行测试。 See it working here

<小时/> 您可以构建DFA并将其转换为正则表达式。 DFA已经在another answer中构建。你可以阅读它,它解释得非常好。 一般的想法是删除节点,添加边。 before

变为:

after

<小时/> 使用此转换和我链接的答案中的DFA,以下是获取正则表达式的步骤: step1 step2 step3 step4 step5

答案 1 :(得分:1)

2^0 =  1 =  1 mod 5
2^1 =  2 =  2 mod 5
2^2 =  4 = -1 mod 5
2^3 =  8 = -2 mod 5
2^4 = 16 =  1 mod 5
2^5 = 32 =  2 mod 5
   ...     -1 mod 5
   ...     -2 mod 5

所以我们有一个1,2,-1,-2模式。有两个子模式只有数字的符号交替:让 n 是数字编号,最低有效数字的编号是0;奇数模式是

(-1)^(n)

甚至模式都是

2x((-1)^(n))

那么,如何使用它?

让原始数字为100011,将数字数字分为偶数和奇数两部分。分别对每个零件数字求和。将奇数位的总和乘以2.现在,如果结果可以被偶数位的总和整除,则原始数字可以被5整除,否则它不可被整除。例如:

100011
1_0_1_ 1+0+1 = 2
_0_0_1 0+0+1 = 1; 1x2 = 2

2 mod(2) equals 0? Yes. Therefore, original number is divisible.

如何在正则表达式中应用它?在正则表达式中使用callout函数可以应用它。标注提供了一种在正则表达式模式匹配过程中临时将控制传递给脚本的方法。

然而,ndn的答案更合适,更容易,因此我建议使用他的答案。

答案 2 :(得分:0)

然而,&#34; ^(0 | 1(10)*(0 | 11)(01 * 01 | 01 * 00(10)*(0 | 11)) 1) $&#34;匹配空字符串。

相关问题