alert(/([0-9]+)(-?)([0-9]+)/.test("021-sfdfdf"));
alert(RegExp.$1);
alert(RegExp.$2);
alert(RegExp.$3);
我想返回结果是false,但怎么是true呢,$1,$2,$3的结果也很奇怪

解决方案 »

  1.   

    true
    021正则会像正确的匹配所以([0-9]+)匹配到了02
    (-?)匹配到了空
    ([0-9]+)匹配到了1021就已经完成匹配了弹出的结果页是正确的
      

  2.   


    alert(/^([0-9]+?)(-?)([0-9]+?)$/.test("021-sdf"));匹配开始和结束,另外使用非贪婪模式
      

  3.   

    正则表达会匹配所有正确的alert("021-sfdfdf".match(/([0-9]+)(-?)([0-9]+)/));碰到这样的问题,直接这样就可以看出你匹配出来的是什么,很容易纠错。
    RegExp.$1是RegExp的一个属性,指的是与正则表达式匹配的第一个子匹配字符串,以此类推var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; //正则表达式 匹配出生日期(简单匹配)     
    r.exec('1988-10-10');
    s1=RegExp.$1;
    s2=RegExp.$2;
    s3=RegExp.$3;
    alert(s1+" "+s2+" "+s3)//结果为1988 10 10
      

  4.   

    首先你的
    alert(/([0-9]+)(-?)([0-9]+)/.test("021-sfdfdf"));
    按你意思应该是
    alert(/^([0-9]+)(-?)([0-9]+)$/.test("021-sfdfdf"));其次回答一下你这句
    为什么匹配到2就停了呢,在没有指定非贪婪的情况下,+号或*号应该最大匹配才对呀
    021-sfdfdf
    ([0-9]+)(-?)([0-9]+)
    0-9+尽可能多的匹配,结果021,然后发现-,不是0-9范围的,匹配结束,尝试后面的
    (-?)匹配到了-,匹配成功,继续,发现时s不是-,因为前面[0-9]+,这个贪婪模式,是允许回溯的,所以,这里产生回溯,回到上一个0-9的状态匹配点
    [0-9]+匹配02,(-?)尝试匹配1失败,因为允许回溯0或1次,所以继续查看后续表达式,([0-9]+)可以捕获到1了。回溯,-?匹配0次。最终结果就是
    ([0-9]+) -> 02
    (-?)     -> 匹配0次
    ([0-9]+) -> 1