【问题标题】:Extracting valid date from a string从字符串中提取有效日期
【发布时间】:2016-12-08 20:26:36
【问题描述】:

我需要从随机字符串列表中提取一个有效日期。日期可以使用不同类型的分隔符以任何日期格式(“01/25/16”、“25/01/2016”、“20-01-2016”、“3-Nov-2016”等)出现。

我尝试了使用 Date.parse() 和 new Date() 但这些方法也为传递的任何数字返回一个有效值,理想情况下不是日期。

例如:Date.parse("1") = 978336000000

我目前的解决方案是使用以下正则表达式检查每个字符串

  if(!string.match(/^\d+$|[a-zA-Z]+\s*[a-zA-Z0-9]*/) && (string.length > 7)) {
    const date = Date.parse(string)
    return (!isNaN(date))
  }

此正则表达式可用于识别日期字符串,例如“01/25/16”、“25/01/2016”、“20-01-2016” 此正则表达式匹配大多数常规文本,如“100”、“hello”、“123hello”、“1h ello12”,并允许输入“123-123”、“01/25/16”和 Date.parse() 等值挺好的。

但这错过了像“23-Nov-2016”这样的日期字符串,所以我在前一个正则表达式的同时添加了一个正则表达式

    if(((!string.match(/^\d+$|[a-zA-Z]+\s*[a-zA-Z0-9]*/) && (string.length > 7)) || ((string.match(/^\d+$|[a-zA-Z]+\s*[a-zA-Z0-9]*/) && string.toLowerCase.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/))) {
       const date = Date.parse(string)
       return (!isNaN(date))
    }

我绝对相信存在比在 javascript 中使用大量正则表达式更简单的解决方案。

编辑:我不控制日期输入规则来专门验证某些格式。

【问题讨论】:

  • 要求用户在 dd/mm/yyyy 中输入日期
  • 如果你想让它更简单,让 datejs 为你处理。 github.com/datejs/Datejs 你想要的是使用 Date.parse()
  • 如果你需要检查 mm/dd/yy 和 dd/mm/yyyy,你怎么知道你不会得到 dd/mm/yy 或 mm/dd/yyyy 的格式?这个问题作为一个真正需要解决的问题没有意义。
  • 同样,来自MDN --- 注意:由于浏览器的差异和不一致,强烈建议不要使用 Date.parse 解析字符串。
  • @andi :这里的问题是我不控制输入。我只是得到一个可能包含或不包含日期的字符串列表。我只是在寻找一种可能适用于大多数情况(如果不是全部)的解决方案。

标签: javascript regex node.js validation date


【解决方案1】:

很遗憾,我认为没有比使用一组正则表达式更好的解决方案。

问题是至少有一百万种不同的方式来写同一个日期。似乎无论您计划使用哪种日期格式,您的用户总会想出一些不合适的东西。因此,对于我正在从事的项目,我采用以下方式处理此问题:

  1. 列出可接受的日期格式。

  2. 告诉用户不要使用不同的格式,并通过客户端验证强制执行。

就我而言,我住在美国,日期通常写成“M/D/YY”。为了允许合理的变化范围,我编写了代码以接受M/D/YYM/D/YYYYM/D(如果省略年份,则替换当前年份)。这些格式使用正则表达式识别,然后使用Moment.js 库进行解析。

如果您的用户习惯使用它们,您可能希望扩展允许的格式列表 - 这很好。但重要的是要意识到您无法计划所有可能的格式 - 变化太多了。

如果您能够在 90% 的时间内满足用户的期望(使用最常见的格式)并培训您的用户这些是可接受的格式,那么您将拥有满意的用户和不长 10,000 行的日期解析代码。

【讨论】:

  • 感谢您的所有意见。正如您所说,如果我们不强制执行客户端验证,用户可以通过多种方式输入日期。我确保我的正则表达式验证了大部分可能性,并为我的目的找出日期。
猜你喜欢
  • 2017-03-19
  • 1970-01-01
  • 2011-02-17
  • 2020-08-14
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多