繁体   English   中英

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

[英]Regular Expression for Binary Numbers Divisible by 5

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

有什么建议?

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

添加^$以使用regexp对其进行测试。 看到它在这里工作


您可以构建DFA并将其转换为正则表达式。 DFA已经在另一个答案中构建。 你可以阅读它,它解释得非常好。
一般的想法是删除节点,添加边。 之前

变为:

后


使用此转换和我链接的答案中的DFA,以下是获取正则表达式的步骤: 步骤1 第2步 第三步: 第4步 STEP5

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.

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

但是,ndn的答案更合适也更容易,因此我建议使用他的答案。

但是,“^(0 | 1(10)*(0 | 11)(01 * 01 | 01 * 00(10)*(0 | 11)) 1) $”匹配空字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM