【发布时间】:2019-12-03 08:24:29
【问题描述】:
我有验证日期(MM/dd/yyyy)格式的正则表达式。
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)
有效格式示例: 03/04/1991
如果我写的是 3/04/1991 或 03/4/1991 而不是 03 或 04它不起作用。
如何验证带/不带零的日期格式?
【问题讨论】:
标签: regex validation
我有验证日期(MM/dd/yyyy)格式的正则表达式。
(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)
有效格式示例: 03/04/1991
如果我写的是 3/04/1991 或 03/4/1991 而不是 03 或 04它不起作用。
如何验证带/不带零的日期格式?
【问题讨论】:
标签: regex validation
您可以将 0 设为可选,在匹配 19 或 20 后添加 2 个数字 \d\d 并使用字边界 \b。
如果不需要捕获组,可以使用非捕获(?:groups`
\b(?:0?[1-9]|1[012])[- /.](?:0?[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\d\d\b
如果你想有一致的分隔符,你可以使用一个捕获组和一个backreference \1 到组中捕获的内容不匹配,例如3/04-1991
\b(?:0?[1-9]|1[012])([- /.])(?:0?[1-9]|[12][0-9]|3[01])\1(?:19|20)\d\d\b
^ ^ ^^
【讨论】:
我看到您正在尝试使用正则表达式来强制输入数字验证。这是可行的,但通常不推荐 - 仅捕获数字并稍后验证捕获数据的有效性更简单且更具可读性:\d{1,2}[/.-]\d{1,2}[/.-]\d{4}
特别是如果您想达到 2100 年 ;-) 这也将允许您向用户返回更多信息性错误消息:而不是“错误解析输入”,您可能会说“无效的第 13 个月”之类的内容或类似的。
话虽如此,如果您使正则表达式足够复杂,则可以强制执行所有要求:(0?[1-9]|[12]\d|3[0-1])
【讨论】: