【问题标题】:How to allow regex to work for mm/dd/yyyy and yyyy-mm-dd format如何让正则表达式适用于 mm/dd/yyyy 和 yyyy-mm-dd 格式
【发布时间】:2014-04-09 16:15:25
【问题描述】:

我的 mm/dd/yyyy 正则表达式是:

/^((0[1-9]|1[012])[\/](0[1-9]|[12][0-9]|3[01])[\/](19|20)[0-9]{2})*$/

我想将它用于 mm/dd/yyyy 和 yyyy-mm-dd 两种格式。

我也尝试过以下一个,但不希望用户输入任何日期和月份的数字。

/^((\d{4})-(\d{2})-(\d{2})|(\d{2})\/(\d{2})\/(\d{4}))$/

我尝试在下面使其正常工作,但不确定这里出了什么问题:

/^((0[1-9]|1[012])[\/](0[1-9]|[12][0-9]|3[01])[\/](19|20)[0-9]{2})|((19|20)[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])*$/

【问题讨论】:

  • 将日期传递给new Date() 看看会发生什么不是更容易吗?
  • 你为什么不简单把 |他们之间?
  • 如果你能提供一个例子就好了。我试过了,但似乎没有用!
  • 别忘了世界其他地方也使用 dd-mm-yyyy 的逻辑顺序。

标签: javascript regex validation date


【解决方案1】:

下面为您提供了一个函数,该函数为您描述的格式生成解析器。 dateParser('yyyy/mm/dd')('1990-03-25'){ y: 1990, m: 3, d: 25 }

您也可以使用chain 函数从而chain([dateParser('mm/dd/yyyy'), dateParser('yyyy-mm-dd')])('2014-04-04') 按顺序尝试格式。

var patterns = {
  yyyy: '\\d{4}',
  yy:   '\\d{2}',
  mm:   '0\\d|1[012]',
  m:    '0?\\d|1[012]',
  dd:   '[3][01]|[012]\\d',
  d:    '[3][01]|[012]?\\d',
  HH:   '[2][0-4]|[01][0-9]',
  H:    '[2][0-4]|[01]?[0-9]',
  hh:   '[1][0-2]|0\\d',
  h:    '[1][0-2]|0?\\d',
  MM:   '[0-5]\\d',
  M:    '[0-5]?\\d',
  ss:   '[0-5]\\d',
  s:    '[0-5]?\\d'
}

function dateParser(pattern) {
  var groupToFieldNames = [null];
  var regexPattern = pattern.replace(
      /([A-Za-z]+)|[.?+*\[\]\(\)\{\}^$\|\\]/g,
      function (m, field, punc) {
        if (patterns.hasOwnProperty(field)) {
          groupToFieldNames.push(field[0]);
          return '(' + patterns[field] + ')';
        } else if (punc) {
          return '\\' + punc;
        } else {
          return m;
        }
      });
  var regex = new RegExp('^' + regexPattern + '$');
  return function (dateString) {
    var match = dateString.match(regex);
    if (match) {
      var fields = {};
      for (var i = 1, n = groupToFieldNames.length; i < n; ++i) {
        fields[groupToFieldNames[i]] = parseInt(match[i], 10);
      }
      return fields;
    }
  };
}

function chain(parsers) {
  var arr = parsers.slice(0);
  return function (x) {
    for (var i = 0, n = arr.length; i < n; ++i) {
      var result = (0,arr[i])(x);
      if (result) { return result; }
    }
  };
}

console.log(JSON.stringify(
    dateParser('yyyy/mm/dd H:MM:ss')('2014/12/31 7:30:25')
));

console.log(JSON.stringify(
    chain([dateParser('mm/dd/yyyy'), dateParser('yyyy-mm-dd')])
    ('2014-04-04')
));

【讨论】:

    【解决方案2】:

    这就是你所需要的:

    var regex = /^\d{2}\/\d{2}\/\d{4}|\d{4}-\d{2}-\d{2}$/;
    
    regex.test("1990-03-25") // returns true
    regex.test("01/10/2006") // returns true
    

    【讨论】:

    • 他希望月份和日期也是有效值。
    • 我建议通过正则表达式验证基本格式,然后将其传递给日期构造函数,如 cmets 中所述。你真的想要一个防止闰日的正则表达式吗?它很快就变得丑陋了。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 2016-01-02
    • 1970-01-01
    • 2020-04-09
    • 2023-04-07
    • 2013-08-31
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多