用正则判断能否被3整除

问题

使用正则判断n能否被3整除

思路

根据整除性构建DFA(确定有限自动状态机),再根据DFA构建正则(Kleen算法

解决

我们从高位读取字符串,并将余数作为状态,有如下状态转移表:
X |'0''1'
0 | 0 1
1 | 2 0
2 | 1 2
(X表示 状态\当前字符)
比如说状态是2,说明当前数字除3余2,那么当前字符是'0'时,余数自然是1,应该转移到1状态

DFA如下:


DFA

初始状态是0,我们只要判断终结状态是否为0即可
观察图中的一个自环和一个0-1-2-1-0的大环,我们可以写出两种正则
0*
1(01*0)*1
故得到 (0 | 1(01*0)*1)*

代码

for(var i=1;i<100;i++)
 if(!/^(0|1(01*0)*1)*$/.test(Number(3*i).toString(2))) console.log(i)//undefined

Tips

  • 符合要求的正则不止一个,但是上述正则应该是最简单的之一
  • 按照相应算法,可以获得任意数字的整除性判断正则

Ref

https://en.wikipedia.org/wiki/Kleene%27s_algorithm
https://zhidao.baidu.com/question/1383837207982172220.html
Algorithm 4th P518

推荐阅读更多精彩内容

  • JS正则表达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路 Stinson 关注 20...
    小杰的简书阅读 261评论 0 1
  • 之前在知乎上看到了有人用正则表达式匹配3的倍数,不觉呀然一惊,原来正则表达式还能这么用,匹配邮箱、URL简直是太弱...
    Crazy_Urus阅读 2,215评论 1 1
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 2,687评论 0 19
  • 2017年10月12日 星期四 多云转晴 今早起来有点冷,所以又给俩宝加了衣服,不用担心会冻着她们了。...
    云哲云灿妈妈阅读 44评论 0 0
  • 今天本来答应儿子带他出去玩,结果因为下雨没敢出去,于是便和他们兄妹俩个窝在家里玩,让儿子抄完英雄的故事和做完...
    王科棋阅读 37评论 0 0