【问题标题】:Regular Expression for Binary Numbers Divisible by 5可被 5 整除的二进制数的正则表达式
【发布时间】:2016-04-01 06:55:06
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 请向我们展示您的尝试以及它是如何不起作用的。
  • 我真的不知道从哪里开始,因为数字非常不同:0101、1010、1111、10100 ...没有适用的特殊规则
  • 广义帕斯卡整除标准给出了 (1, 2, 4, 3, 1, ...) 的归约序列,我几乎看不出正则表达式如何利用它。但是,如果您的最终目标只是检查巨大的二进制数的可分性,您可以直接使用它。只需通过您的号码从最低位乘以序列号上的数字并收集总数。总数的余数是初始数的余数。这是迄今为止我找到的最好的链接mathworld.wolfram.com/DivisibilityTests.html
  • 正则表达式不是这项工作的正确工具。
  • @VasilyLiaskovsky,这是 FDA/正则表达式练习的经典示例。看看我的回答。

标签: regex binary division


【解决方案1】:
(0|1(10)*(0|11)(01*01|01*00(10)*(0|11))*1)*

添加^$ 以使用正则表达式对其进行测试。 See it working here


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

变成:


使用此转换和我链接的答案中的 DFA,以下是获取正则表达式的步骤:
(编辑:请注意,图中的标签“Q3”和“Q4”被错误地交换了。这些状态代表模数 5 之后的余数。)

【讨论】:

  • 如果您的回答是正确的,我将非常高兴。但如果你的答案是正确的,为什么这不匹配? regex101.com/r/hP1cO0/1
  • 找到了原因。好的。你是对的,恭喜!我很高兴看到您的答案有效,因为我花了 3 个小时来搜索正则表达式,并且因为我认为没有解决方案而感到失望。
  • 这个解决方案太棒了。但只是为了技术性,实际答案将是零次或多次提到的答案。不是吗?
  • @SoumyaKantiNaskar,你是什么意思。
  • 图片很好的回答。对此表示敬意。在尝试自己从头开始破译这个逻辑之后,只有一个简短的评论:您似乎在起始图像中混淆了 Q3 和 Q4 状态名称,使其更难遵循(显然这对正确结果没有任何影响 -只是让我们更难理解起始情况是如何产生的)。
【解决方案2】:
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的回答更合适也更容易,所以我推荐用他的回答。

【讨论】:

  • 我认为 OP 想要正则表达式的数学概念,而不是带有标注的正则表达式。
  • “纯正则表达式无法做到这一点” - 错误,请参阅我的答案。
【解决方案3】:

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

【讨论】:

  • 这真的回答了这个问题吗?如果有,请提供更多信息。
  • 如果有人正在寻找与空字符串不匹配的模式:^(0|1(10)*(0|11)(01*01|01*00(10)*(0|11))*1)+$
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2011-01-26
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多