高分求解“+1y -2m +3w -4d”这种日期表示法的正则表达式 需要验证jQueryUI Datepicker的文本框中用户输入的日期参数格式是否符合要求,其中y,m,w,d分别表示年,月,周,日,4者任意搭配,但不能重复出现,例如“+1y -2m +3w -4d”表示从今天开始往后1年,再往前2个月,再往后3周,再往前4天的日期,请问各位前辈这个正则该怎么写呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 > var p = /[+-][0-9]+[ymdw]/g;undefined> '+1y -2m +3w -4d'.match(p)[ '+1y', '-2m', '+3w', '-4d' ]> 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"));一定要用正则吗?不会了 多谢楼上各位大侠,特别值得注意的是2楼的这位大侠提供的解法,非常的接近需求:只是在运行的时候,会返回由3个元素组成的数组,请问有没有可能用这样的一个表达式,其结果只返回一个元素呢?>>> reg.exec('-1y +2d +3m -4w');["-1y +2d +3m -4w", undefined, "-4w"]拜谢!!! var reg = /^(?!.*?(?:[ymwd]).*?\1)(?:[+-]\d+[ymwd] *){1,4}$/; 多谢这位大侠的回复,这个表达式也非常接近需求,只返回了一个元素的数组,可是当y m w d中有重复的时候,也会返回,这一点 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')); 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 导航栏效果 急!急!求教【firefox】 HTML窗口最小化怎么实现?【在线等】 popup上如何禁止右鍵 jquery背景轮换问题?求解! 怎样在父页面获得iframe中某个域的值 通过DOM查找节点,找不到的话返回值是什么? $.getJSON() 虚拟目录无法发布,请指教 关于动态显示图片的问题 急!!!如何得到数组 请问在栈或堆中,怎么存储函数 JS问题
> var p = /[+-][0-9]+[ymdw]/g;
undefined
> '+1y -2m +3w -4d'.match(p)
[ '+1y',
'-2m',
'+3w',
'-4d' ]
>
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"));
一定要用正则吗?不会了
>>> reg.exec('-1y +2d +3m -4w');
["-1y +2d +3m -4w", undefined, "-4w"]
拜谢!!!
多谢这位大侠的回复,这个表达式也非常接近需求,只返回了一个元素的数组,可是当y m w d中有重复的时候,也会返回,这一点
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'));
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