如何巧用一个正则表达式判断素数(质数)
1、先来看这个正则表达式
/^.?$|^(..+?)\1+$/
下面按顺序解释一下:
/表示正则表达式开始或结束
^表示匹配字符串的开头
.表示任意单个字符(除了换行、制表符、空格等空字符)
?表示出现0次或1次
$表示匹配字符串的结尾
|表示逻辑或
^表示匹配字符串的开头
(子表达式开头扩起来
.表示任意单个字符(除了换行、制表符、空格等空字符)
+表示出现1次或更多次
?表示出现0次或1次
)子表达式结尾扩起来
\1表示匹配前面的子字符串
+表示出现1次或更多次
$表示匹配字符串的结尾
/表示正则表达式开始或结束

2、在JS中,可以使用这个正则表达式,来判断一个正整数是否为素数。
使用语法:
!/^.?$|^(..+?)\1+$/.test(Array(你的数字+1).join('1'))
结果为true,表示是素数
结果为false,表示不是素数(为1或者合数)

3、具体我们来用Chrome浏览器来演示:
首先,我们打开Chrome浏览器,按下F12进入开发者调试界面。
点击Console,进入控制台。

4、在控制台中输入上述代码,
并且修改代码中需检验是否为素数的数字,
例如: 19
然后按下回车,查看结果。
结果为true,表示是素数。
结果为false,表示不是素数。

5、注意,在JS中,由于数组有长度限制。
最大长度为Math.pow(2,32) ,即4294967296
如果你需要检验的数字,比4294967296还大,
那么上述代码中的Array就会报错。
此时,我们可以使用for循环改写一下
即用for循环来把字符串拼接起来,进行素性测试。
var t='';for(var i=0;i<你的数字;i++){t+='1'} !/^.?$|^(..+?)\1+$/.test(t)
上述代码中加粗部分你的数字,修改为实际需要检测的正整数即可。

6、最后,我们来介绍一下,
如何借助上面的素数检验的正则表达式,
来快速打印素数表。
分别以100以内和1000以内的素数表为例。
我们只需在Chrome控制台,输入代码
var t=[];for(var i=1;i<100;i++){if(!/^.?$|^(..+?)\1+$/.test(Array(i+1).join('1'))){t.push(i)}} t.join(' ')
其中加粗部分数字100,可以改为你希望的数字,
用于控制质数输出的最大范围(注意,不要超过4294967296,否则要改写代码)。
