剖析正则表达式判断数字是否为素数的工作原理

[素数小知识] → 定义,素数是什么?一个数,如果只有1和它本身两个因数,这样的数叫做质数(或素数)。在数学领域里.规定1不是素数。比如:3 = 1*3, 3是素数;17 = 1*17,17是素数;4=1*4=2*2,4不是素数;12=1*12=2*6=3*4,12不是素数。

    判读素数前对数字转换

    要使用该正规则表达式,首先需要把自然数给转成包含多个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为自然数。

posted @ 2010-07-28 17:39  Tokyo  阅读(739)  评论(0编辑  收藏  举报