【发布时间】: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