<script>
var str = "abc??fdsa??";
var newstr = str.replace(/\?\?/g, '');
if(str==newstr)
{
alert("不存在两个连续的“?”");
}
else
{
alert("存在两个连续的“?”");
}if(newstr.indexOf('?')==-1)
{
alert("不存在单个的“?”");
}
else
{
alert("存在单个的“?");
}
</script>

解决方案 »

  1.   

    <script language=javascript>
    <!--
    function test(str){
    //测试字符串是否是全部成对的,或全部单个的
    if(str.indexOf("??")!=-1 && (str.replace("??","")).indexOf("?")==-1)
    {alert("all couple")}
    //如果存在"??",且把全部的"??"替换为空后不再存在"?",则说明原来的字符串中有且只含有成对的"??"if(str.indexOf("?")!=-1 && str.indexOf("??")==-1){alert("all single")}
    //如果存在"?",且不存在"??",说明原来的字符串在全部是单个的"?"
    }
    //-->
    </script>
    <input id=text1><input type=button onclick="test(text1.value)" value=test>
      

  2.   

    wzhiyuan(我是谁): //如果存在"??",且把全部的"??"替换为空后不再存在"?",则说明原来的字符串中有且只含有成对的"??"
    你这句话有些漏洞,比如说我四个八个?连在一起就跳过了你的检测了,再说你的这种str.replace("??","")写法本身就有问题(不是全局替换)。所以你的正则应该再改:
    function test(str)
    {
      if(!/\?/.test(str.replace(/([^\?])\?\?([^\?])/g, "$1$2")))
        alert("双问号确实是成对出现的,并且出现的位置不在字头字尾");
      else alert("你的字符串非法!");
    }
    2.不能重复,你用indexOf("??")就可以判断了
      

  3.   

    To:meizz(梅花雪) 
    你的提醒是对的,按我原来的想法,确实漏考虑了2n个连续?的情况,按此思路,再加个判断是否含有连续三个?的子句,即indexOf("???")==-1 就可以了。
    我还有个重大失误是,js手册里说的stringObj.replace(rgExp, replaceText),如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找.所以我没写成正则的形式,本意是以为他会象vbs里的replace那样,进行全局替换的,结果却是只替换一次,真正让我大跌眼镜。
    你的正则我还没细看。先忙去了,有空再看。