要求输入中:
        1,  只能是数字或*
        2,  不能存在两个连着的*
        3,  至少存在一组连着的三个数字

解决方案 »

  1.   

    var regex = /^((?!\*\*)[\d\*])*?\d{3}((?!\*\*)[\d\*])*?$/;
    var str = ["111**11*11","11*11*111","1*1*1"];
    for(var i = 0 ; i < str.length ; i ++)
    {
        document.write(str[i]+"_____" +regex.test(str[i])+"</br>")
    }
    /*
    111**11*11_____false
    11*11*111_____true
    1*1*1_____false
    */试试看,有没有bug我不知道
      

  2.   

    1楼的好像可以,不过楼主好像没说清楚,没有3个连续的数字,但又4个连续的算不算呢?借鉴1楼的代码,写出下面这个(必须要有3个连续的,只有4个的不算):var regex = /(?=^[\d*]*$)(?=^(?!.*\*\*))(?=.*([^\d]|^)\d{3}([^\d]|$))/; //ie bug
    var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];
    for(var i = 0 ; i < str.length ; i ++) {
    document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
    }
    /*
    111**22*33_____false
    11*22*333_____true
    1*2*3_____false
    *111*22**_____false
    a*111*22*_____false
    *1111*_____false
    */不过在IE6/7里面好像杯具了,又跟标准有出入了吗?反正跟IE8和其它非IE浏览器不一样:/*
    111**22*33_____false
    11*22*333_____false
    1*2*3_____false
    *111*22**_____false
    a*111*22*_____false
    *1111*_____false
    */后来发现,改一个写法,IE貌似可以支持了:var regex = /(?!.*[^\d*])(?=^(?!.*\*\*))(?=.*([^\d]|^)\d{3}([^\d]|$))/;
    var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];
    for(var i = 0 ; i < str.length ; i ++) {
    document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
    }
    /*
    111**22*33_____false
    11*22*333_____true
    1*2*3_____false
    *111*22**_____false
    a*111*22*_____false
    *1111*_____false
    */另外我还测试过好多写法,不少结果都有些匪夷所思。
    比如那些看似不需要加的(?=),好像也会导致结果不同,即使是在那些规范的浏览器中。
    也可能是我测试的过程有疏漏吧。
    不过不管怎样,我现在也无法确定从规范的逻辑上讲,上面的正则是否100%正确。所以建议楼主:如果没有特殊要求的话,像这种复杂的情况还是分成多个简单的情况处理好了,比如分别用三个正则来依次处理。
    把问题分解开来,一来不用太费脑子,二来容易保证正确性,再就是跨浏览器兼容性问题也更容易绕开。
      

  3.   

    再补充一个简单有效又容易理解的,也兼容IE6/7的,貌似是100%正确的:var regex = /^\*?(\d+\*)*\d{3}(\*\d+)*\*?$/;
    var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*', '111', '*111*', '1*111*', '**111*'];
    for(var i = 0 ; i < str.length ; i ++) {
    document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
    }
    /*
    111**22*33_____false
    11*22*333_____true
    1*2*3_____false
    *111*22**_____false
    a*111*22*_____false
    *1111*_____false
    111_____true
    *111*_____true
    1*111*_____true
    **111*_____false
    */