正则表达式匹配应为1或2位数,但不是零,日期格式为单位数

时间:2017-02-16 07:45:23

标签: javascript regex

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数字中使用20但不是single的数字匹配重写正则表达式。

4 个答案:

答案 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
  1. 首先,我们使用分隔符-./
  2. 将日期字符串拆分为3个部分
  3. 然后我们将所有3个部分相乘并将产品用于验证
  4. 最后,我们使用isNaN(p) || p<10 || (p>99 && p<1000条件进行验证。 isNan将解决所有无效日期输入,p<=0将解决日,蒙特或年份为零,最后一个条件将以3位数字对年份进行处理。

答案 3 :(得分:0)

这应该适合你:

&#13;
&#13;
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;
&#13;
&#13;