剖析正则表达式判断数字是否为素数的工作原理
判读素数前对数字转换
要使用该正规则表达式,首先需要把自然数给转成包含多个1的一个字符串。比如:2 要写成两位长度的 “11”, 3 要写成三位长度的 “111”,4要写成四位长度的“1111”,5要写成五位长度的“11111”,6要写成六位长度的“111111”......依次类推,15要写成15位长度的“111111111111111”,即把自然数转换为一个包含若干个“1”的字符串,自然数的值就是包含“1”的个数。比如100就转换为由100个“1”组成的字符串,这个工作使用一些脚本语言可以非常轻松的来完成。
正则表达式的工作原理分析
一开始,我也对这个表达式持10分的怀疑的态度,但是又怀有12分的好奇。所以在仔细研究了一下后,发现是相当合理的,下面细细剖析几刀。
首先看到,正则表达式^1?$|^(11+?)\1+$中有个“|”,代表“或”关系,也就是整个表达式可以分解为两个部分:^1?$|和^(11+?)\1+$。
1、^1?$分析:^是匹配字符串开头的位置;$是匹配字符串结束的位置。1?匹配1一次或0次。即表示匹配“空字符串”或“只包含一个1的字符串”,理解起来比较简单。
2、^(11+?)\1+$是整个这种表达式的关键部分,除了匹配字符串开通和结尾位置的^$外,可分解为两部分:(11+?)和(11+?)。
(1)、(11+?)是一个普通捕获组,括号内的内容为11+?,11+?中第一个1匹配字符“1”,后面的1+?意思是匹配字符“1”,加号表示可以字符“1”可以出现1次或多次,加号后面的问号表示懒惰匹配,即在达到要求的前提下,能匹配的越少越好。
(2)、\1+的意思可以这样理解,\1是代表前面捕获组的匹配内容,+号代表匹配1次或多次。(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)
由此可见,这个正规则表达式是取非素数,要得到素数只需对整个表达式求反即可。可以在本机运行以下代码:
<SCRIPT LANGUAGE="JavaScript">
// 求1-n内的素数,n为自然数
function funTest(n){
for(var i=1,t="1"; i<=n; i++,t=t+"1"){
if(!/^1?$|^(11+?)\1+$/.test(t)){
document.write(i + "<BR>");
}
}
}
funTest(100);
</SCRIPT>
上面是阅网分享的一个Javascript脚本代码:用来求1-n内的素数,n为自然数。

浙公网安备 33010602011771号