从字符串

时间:2016-12-08 20:26:37

标签: javascript regex node.js validation date

我需要从随机字符串列表中提取有效日期。日期可以任何日期格式出现(" 01/25/16"," 25/01/2016"," 20-01-2016",& #34; 2016年11月3日和#34;等)使用不同类型的分离器。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

问题在于,至少有一百万种不同的方式来编写相同的日期。似乎无论您计划采用何种日期格式,您的用户总会想出一些不合适的东西。所以我通过以下方式处理了这个问题:

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

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

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

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

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