【问题标题】:JavaScript regex for YYYY-MM-DD with an optional month and dayYYYY-MM-DD 的 JavaScript 正则表达式,带有可选的月份和日期
【发布时间】:2018-11-06 16:06:10
【问题描述】:

我想出了以下 PCRE 正则表达式:

[12]\d{3}(-)?(?(1)(0[1-9]|1[0-2]))(-)?(?(3)(0[1-9]|[12]\d|3[01]))

它匹配以下日期格式:

  • 2018-10-03
  • 2011-03
  • 2003

如您所见,我使用条件语句来检测是否存在指示日期下一部分的破折号。不幸的是,javascript 不支持条件语句。如何将其转换为正则表达式?我尝试过使用包含替代方案的非捕获组,但我没能做到。

编辑:

我不能使用任何 JS 函数,因为正则表达式将用于pattern HTML5 输入属性。

【问题讨论】:

  • "它可以通过非捕获组来解决" "我尝试使用包含替代方案的非捕获组,但我没有设法做到。"我不能使用 jquery 或任何其他 javascript 函数,因为此正则表达式将用于 pattern 字段 (HTML5)。

标签: javascript regex date


【解决方案1】:

你可以使用这个正则表达式:

[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?

基本上它匹配一年,然后使用month 和date 创建一个非捕获组。 date 部分在该组中是optional,而带有月份和日期的the Whole Group 也是optional。

这意味着它将仅匹配年份、年份和月份以及完整的日期与年份、月份和日期。

编辑(添加锚点):

^[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?$

现在它不会匹配“2018-aaa”。

【讨论】:

  • regex.test("2018-asd") --> true
  • 第二个(编辑后)完美运行。谢谢。
【解决方案2】:

这是我想做的非正则表达式版本

var dates = ["2018-10-03","2011-03","2003","12234"]

function isDate(str) {
  var parts = str.split("-"), 
      d = new Date(parts[0],parts.length>1?parts[1]-1:0,parts.length==3?parts[2]:1,12,0,0,0),
      yearOk=parts[0] < 3000 && d.getFullYear()==parts[0]; // or whatever test
  if (parts.length==1) return yearOk;
  var monthOk = +parts[1] == d.getMonth()+1;
  if (parts.length==2) return yearOk && monthOk;
  return yearOk && monthOk &&  +parts[2] == d.getDate();
}
dates.forEach(function(dStr) { console.log(isDate(dStr)) })

【讨论】:

    【解决方案3】:

    YYYY-MM-DD 模式的正则表达式,可选月份和日期

    var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;
    

    【讨论】:

    • regex.test("2018-asd") --> true
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2021-10-19
    相关资源
    最近更新 更多