需要验证jQueryUI Datepicker的文本框中用户输入的日期参数格式是否符合要求,其中y,m,w,d分别表示年,月,周,日,4者任意搭配,但不能重复出现,例如“+1y -2m +3w -4d”表示从今天开始往后1年,再往前2个月,再往后3周,再往前4天的日期,请问各位前辈这个正则该怎么写呢?

解决方案 »

  1.   


    > var p = /[+-][0-9]+[ymdw]/g;
    undefined
    > '+1y -2m +3w -4d'.match(p)
    [ '+1y',
      '-2m',
      '+3w',
      '-4d' ]
      

  2.   

    var reg = /^(?!.*?([ymwd]).*?\1)([+-]\d+[ymwd] *){1,4}$/;
      

  3.   

    var date={
    reg:/^([+-]\d+[ymwd] *){4}$/
    }
    date.check=function(context){
    if(context.indexOf('y')!=-1){
    if(context.indexOf('m')!=-1){
    if(context.indexOf('w')!=-1){
    if(context.indexOf('d')!=-1){
    if(date.reg.test(context)){
    return true;
    }
    }
    }
    }
    }
    return false;
    }
    alert(date.check("+1y -m +3w -4d"));
    一定要用正则吗?不会了
      

  4.   

    多谢楼上各位大侠,特别值得注意的是2楼的这位大侠提供的解法,非常的接近需求:只是在运行的时候,会返回由3个元素组成的数组,请问有没有可能用这样的一个表达式,其结果只返回一个元素呢?
    >>> reg.exec('-1y +2d +3m -4w');
    ["-1y +2d +3m -4w", undefined, "-4w"]
    拜谢!!!
      

  5.   

    var reg = /^(?!.*?(?:[ymwd]).*?\1)(?:[+-]\d+[ymwd] *){1,4}$/;
      

  6.   


    多谢这位大侠的回复,这个表达式也非常接近需求,只返回了一个元素的数组,可是当y m w d中有重复的时候,也会返回,这一点
      

  7.   

    var check = function(s){
      var r = /^(?:\s*[-+]\d+[ymwd]\s*)+$/i;
      var isFormatRight = r.test(s);
       
      if(!isFormatRight) { return false; }
       
      var i, len, repeat=false, map={}, w, a = s.match(/[a-z]/gi);
     
      if(a && a.length <= 4){
        for(i=0, len=a.length; i<len; i++){
          w = a[i].toLowerCase();
          if(map.hasOwnProperty(w)){
            repeat = true;
            break;
          }
          map[w] = null;
        }
      }else{
        repeat = true;
      }  return !repeat;   
    }alert(check(' +1y -2m +3w -4d'));
      

  8.   

    s1 = '+1y -2m +3w -4d';
    s2 = '+1y -2m +3y -4d';document.write(s1+' : '+check(s1));
    document.write(s2+' : '+check(s2));function check(s) {
      if(/([ymwd]).*\1/.test(s)) return false;
      return /[-+][0-9]+[ymwd]/.test(s);
    }
    +1y -2m +3w -4d : true
    +1y -2m +3y -4d : false