Javascript 从字符串中提取有效日期

Javascript 从字符串中提取有效日期,javascript,regex,node.js,validation,date,Javascript,Regex,Node.js,Validation,Date,我需要从随机字符串列表中提取有效日期。日期可以采用任何日期格式(“2016年1月25日”、“2016年1月25日”、“2016年1月20日”、“2016年11月3日”等),并带有不同类型的分隔符 我尝试使用Date.parse()和new Date()方法,但这些方法也会为传递的任何数字返回一个有效值,理想情况下,这些数字不是日期 例如:Date.parse(“1”)=978336000000 我当前的解决方案是使用以下正则表达式检查每个字符串 if(!string.match(/^\d+$

我需要从随机字符串列表中提取有效日期。日期可以采用任何日期格式(“2016年1月25日”、“2016年1月25日”、“2016年1月20日”、“2016年11月3日”等),并带有不同类型的分隔符

我尝试使用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()识别的结果非常好

但这遗漏了日期字符串,如“2016年11月23日”,因此我在前一个正则表达式的基础上又添加了一个正则表达式

    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中使用这些大型正则表达式更简单的解决方案


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

不幸的是,我认为没有比使用一组正则表达式更好的解决方案

问题是,至少有一百万种不同的方式来写同一个日期。看起来无论你计划采用什么日期格式,你的用户总是会想出一些不合适的东西。因此,我在一个项目中采用了以下方法:

  • 列出可接受的日期格式

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

  • 就我而言,我住在美国,日期通常写得像“m/D/YY”。考虑到合理的变化范围,我编写代码以接受
    M/D/YY
    M/D/YYYY
    、和
    M/D
    (如果省略年份,则替换当前年份)。这些格式使用正则表达式识别,然后使用库解析

    如果您的用户习惯使用这些格式,您可能希望扩展允许的格式列表-这很好。但重要的是要认识到,你不可能为所有可能的格式制定计划,因为有太多的变化


    如果您可以在90%的时间内满足用户的期望(使用最常见的格式),并培训用户这些格式是公认的格式,那么您将拥有快乐的用户和长度不超过10000行的日期解析代码。

    不幸的是,我认为没有比使用一组正则表达式更好的解决方案

    问题是,至少有一百万种不同的方式来写同一个日期。看起来无论你计划采用什么日期格式,你的用户总是会想出一些不合适的东西。因此,我在一个项目中采用了以下方法:

  • 列出可接受的日期格式

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

  • 就我而言,我住在美国,日期通常写得像“m/D/YY”。考虑到合理的变化范围,我编写代码以接受
    M/D/YY
    M/D/YYYY
    、和
    M/D
    (如果省略年份,则替换当前年份)。这些格式使用正则表达式识别,然后使用库解析

    如果您的用户习惯使用这些格式,您可能希望扩展允许的格式列表-这很好。但重要的是要认识到,你不可能为所有可能的格式制定计划,因为有太多的变化


    如果您可以在90%的时间内满足用户的期望(使用最常见的格式),并培训用户这些是可接受的格式,您将拥有快乐的用户和长度不超过10000行的日期解析代码。

    请用户在dd/mm/yyyyyy中输入日期如果您希望更简单,让datejs为您处理。如果您需要检查mm/dd/yy和dd/mm/yyyy,您如何知道您不会获得dd/mm/yy或mm/dd/yyyy的格式?作为一个真正需要解决的问题,这个问题毫无意义。另外,from---注意:由于浏览器差异和不一致性,强烈反对使用Date.parse解析字符串。@andi:这里的问题是我无法控制输入。我只是得到一个字符串列表,其中可能包含日期,也可能不包含日期。我只是在寻找一个解决方案,它可能适用于大多数情况,如果不是所有情况。请用户在dd/mm/yyyyy中输入日期如果您希望它更简单,让datejs为您处理。如果您需要检查mm/dd/yy和dd/mm/yyyy,您如何知道您不会获得dd/mm/yy或mm/dd/yyyy的格式?作为一个真正需要解决的问题,这个问题毫无意义。另外,from---注意:由于浏览器差异和不一致性,强烈反对使用Date.parse解析字符串。@andi:这里的问题是我无法控制输入。我只是得到一个字符串列表,其中可能包含日期,也可能不包含日期。我只是在寻找一个解决方案,这可能适用于大多数情况下,如果不是所有的。感谢所有您的投入。正如您正确地说的,如果我们不强制执行客户端验证,用户可以通过多种方式输入日期。我要确保我的正则表达式验证了大多数可能性,并为我的目的从中获取日期。感谢您的所有输入。正如您正确地说的,如果我们不强制执行客户端验证,用户可以通过多种方式输入日期。我要确保我的正则表达式验证了大多数可能性,并为我的目的从中获取日期。