日期:2014-05-16  浏览次数:20342 次

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

------解决方案--------------------
JScript code

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

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

------解决方案--------------------
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"));
一定要用正则吗?不会了
------解决方案--------------------
var reg = /^(?!.*?(?:[ymwd]).*?\1)(?:[+-]\d+[ymwd] *){1,4}$/;
------解决方案--------------------
JScript code
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'));

------解决方案--------------------
JScript code
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);
}