【问题标题】:Date format regex to match date separator日期格式正则表达式以匹配日期分隔符
【发布时间】:2017-04-19 13:30:28
【问题描述】:

我正在使用下面的代码来验证 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/

【问题讨论】:

  • 这是一个更新的小提琴 - jsfiddle.net/90dstrx5/1。使用两种不同的格式并检查是否有任何匹配。
  • @Pugazh 我认为它不起作用。如果您将日期传递为“22/05.2017”,则会出现错误
  • 该错误是由于日期无效。 22/05.2017 是有效的日期格式吗?
  • @Pugazh 的想法是如果用户输入错误,则使 "22/05.2017" 无效。

标签: javascript regex date


【解决方案1】:

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

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

请注意,“数字”现在将出现在结果中的第 1、第 3 和第 4 位;分隔符将位于第二个位置。要消除任何混淆,请使用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

【讨论】:

  • @Salman 是的,这行得通。谢谢(你的)信息。您能否还请我理解为什么我们使用 \2 而不是 \1 来捕获组?我以为我们只需写 \1 以使用我们之前使用的相同捕获组。并且原因编号在第 1、第 3 和第 4 位可用。
  • @whyAto8 在我的正则表达式中有 4 个捕获组,由() 生成。第二组将包含./
  • @Salman 是的,我后来意识到了这一点。具有有限的正则表达式技能。无论如何,非常感谢您的帮助。
【解决方案2】:

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

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'))

【讨论】:

  • @Puzagh 是的,这是一种解决方法..但我更倾向于使用捕获组,因为我会继续添加更多分隔符。
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多