var dateObj = {
'01/01/2017' : true,
'1/1/2016' : true,
'1/1/16' : true,
'1/1/116' : false,
'01/11/2016' : true,
'01.01.2016' : true,
'01.01_2016' : false,
'01-0-2016' : false,
'01-01-2016' : true
};
var failedAttempts = [];
var date_val = "01/01/2017";
var re = /^(\d{1,2})[/.\-](\d{1,2})[/.\-](\d{4}|\d{2})$/;
for(let i in dateObj){
let result = re.test(i);
if(result != dateObj[i]){
failedAttempts.push(i);
}
}
if(failedAttempts.length > 0){
console.error('Unit test fails');
console.log(failedAttempts);
}else{
console.log('Unit test pass');
}
'01-0-2016' : false
认为这种情况即使格式错误也会返回true。我想在1
数字中使用2
或0
但不是single
的数字匹配重写正则表达式。
答案 0 :(得分:2)
使用负(?!0+\b)
前瞻限制数字匹配模式:
/^(?!0+\b)(\d{1,2})[\/.-](?!0+\b)(\d{1,2})[\/.-](\d{4}|\d{2})$/
^^^^^^^^ ^^^^^^^^
请参阅regex demo
如果您不需要限制两个月的零件,只需删除不必要的前瞻。
(?!0+\b)
模式匹配一个或多个零后跟一个单词边界(也就是说,之后不能有任何字母/数字/ _
),如果找到模式,则匹配失败了。
答案 1 :(得分:0)
我建议可以有几种方式:
var re = /^(\d{1,2})[/.\-]([1-9]|[0-9]{2})[/.\-](\d{4}|\d{2})$/;
如果它能解决您的问题,请告诉我。
答案 2 :(得分:0)
以下是使用dd/mm/yyyy
或/dd/mm/yy
格式验证输入日期字符串的非正则方法:
for(let str in dateObj) {
var parts = str.split(/[-.\/]/);
var p = parts[0]*parts[1]*parts[2];
if (isNaN(p) || p<10 || (p>99 && p<1000)) {
console.log("Invalid date: ", str);
}
}
<强>输出:强>
Invalid date: 1/1/116
Invalid date: 01.01_2016
Invalid date: 01-0-2016
-
或.
或/
isNaN(p) || p<10 || (p>99 && p<1000
条件进行验证。 isNan
将解决所有无效日期输入,p<=0
将解决日,蒙特或年份为零,最后一个条件将以3位数字对年份进行处理。答案 3 :(得分:0)
这应该适合你:
const validateDate = (date) => /^(?:[1-2]\d|0?[1-9]|30|31)([.\/-])(?:0?[1-9]|1[0-2])\1(?:\d{4}|\d{2})$/.test(date)
const testData = [`01/01/2017`, `1/1/2016`, `1/1/16`, `01/11/2016`, `01.01.2016`, `01-01-2016`, `01.0.2016`, `01.01_2016`, `01-0-2016`, `1/1/116`, `41.23.23`]
for (const date of testData){
console.log(`${date} ${validateDate(date)}`)
}
&#13;