日期格式正则表达式匹配日期分隔符

时间:2017-04-19 13:30:28

标签: javascript regex date

我使用以下代码验证dd/mm/yyyydd.mm.yyyy格式的日期格式。

function validateDate(date){
    var matches, d, m, y, cDate, format, dateFormatObj;
    dateFormatObj = { format: /^(\d{2})[./](\d{2})[./](\d{4})$/, monthPos: 2, datePos:1,    yearPos:3}

    format = dateFormatObj.format;
    matches = format.exec(date);

    d = matches[dateFormatObj.datePos];
    m = matches[dateFormatObj.monthPos] - 1;
    y = matches[dateFormatObj.yearPos];
    cDate = new Date(y, m, d);

    return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}

alert(validateDate('22/05/2017'))

这对我来说很好,可以验证基本日期。

我试图解决的问题是,如果月份,日期和年份值之间的分隔符(/或。)不同,那么它应该使其无效。

我尝试将正则表达式格式更改为/^(\d{2})[./](\d{2})\1(\d{4})$/,基本上使用与指定相同的捕获组,但这似乎不起作用,“匹配”出现为空。我看了几篇帖子,但似乎缺少了一些东西。我该怎么做才能使这项工作。

JS小提琴 - https://jsfiddle.net/90dstrx5/

2 个答案:

答案 0 :(得分:3)

您可以按如下方式重写正则表达式:

/^(\d{2})([./])(\d{2})\2(\d{4})$/
//       ^            ^
//       |            +---- match capturing group #2
//       +----------------- capturing group #2

请注意,“数字”现在可在结果的第1,第3和第4位置使用;分隔符将位于第2位。要消除任何混淆,请使用Array.splice()来消除它:

function validateDate(date) {
  var matches, d, m, y, cDate, format, dateFormatObj;
  dateFormatObj = {
    format: /^(\d{2})([./])(\d{2})\2(\d{4})$/,
    monthPos: 2,
    datePos: 1,
    yearPos: 3
  };
  format = dateFormatObj.format;
  matches = format.exec(date);
  if (matches === null) {
    return false;
  }
  matches.splice(2, 1);
  d = matches[dateFormatObj.datePos];
  m = matches[dateFormatObj.monthPos] - 1;
  y = matches[dateFormatObj.yearPos];
  cDate = new Date(y, m, d);
  return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}
console.log(validateDate('22/05/2017')); // true
console.log(validateDate('22/05.2017')); // false

答案 1 :(得分:1)

我想不出一种调整正则表达式的方法。但这是一个解决方法,指定了两个分隔符。

function validateDate(date) {
  var matches, d, m, y, cDate, format, dateFormatObj;
  dateFormatObj = {
    format1: /^(\d{2})[.](\d{2})[.](\d{4})$/,
    format2: /^(\d{2})[/](\d{2})[/](\d{4})$/,
    monthPos: 2,
    datePos: 1,
    yearPos: 3
  }
  format1 = dateFormatObj.format1;
  format2 = dateFormatObj.format2;
  matches = format1.exec(date) || format2.exec(date);

  if (matches == null)
    return false;

  d = matches[dateFormatObj.datePos];
  m = matches[dateFormatObj.monthPos] - 1;
  y = matches[dateFormatObj.yearPos];
  cDate = new Date(y, m, d);
  return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}

alert(validateDate('22/05.2017'))