【问题标题】:How to write regex for date format validation?如何为日期格式验证编写正则表达式?
【发布时间】:2019-06-18 09:54:43
【问题描述】:

我写了如下的正则表达式:

/^(\d{4}\-\d\d\-\d\d)|(\d{4}\-\d\d\-\d\d([tT][\d:\.]*){1})([zZ]|([+\-])(\d\d):?(\d\d))?$/.test("1995-01-01")

它工作正常,但即使我给出错误的格式也返回 true 作为值请参考下面的截图:

【问题讨论】:

  • 您没有正确分组模式。试试/^(?:(\d{4}\-\d\d\-\d\d)|(\d{4}\-\d\d\-\d\d([tT][\d:\.]*){1})([zZ]|([+\-])(\d\d):?(\d\d))?)$/
  • @WiktorStribiżew,将此作为答案发布
  • 这个问题被this question 错误地关闭了,事实上食尸鬼posted 一个(实际上与当前场景无关)答案类似于该线程中的答案并不会使其成为骗子。这里的问题是如何在一个应该匹配整个字符串的正则表达式中使用两种替代方法。

标签: javascript regex regex-group


【解决方案1】:

试试这个:

const regex = /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$)/;

console.log(regex.test('1995-01-01')) //true
console.log(regex.test('1995-01-016')) //false

【讨论】:

  • 不错的答案,但最好有解释。
  • 你用的是什么工具?
  • 感谢@Ghoul Ahmed
【解决方案2】:

当前正则表达式的问题在于您有两个交替,每个交替仅锚定在一侧,第一个在开头,最后一个在结尾。

快速解决方法是

^(?:(\d{4}-\d\d-\d\d)|(\d{4}-\d\d-\d\d([tT][\d:.]*))([zZ]|([+-])(\d\d):?(\d\d))?)$
 ^^^                 ^                                                          ^

this regex demo

但是,由于两个替代方案都以相同的模式开头,因此将其写为 common_prefix(?:second_alternative_part_after_prefix)? 是有意义的。

模式中还有很多看起来多余的组,就像模式中永远不需要的{1} 量词一样。

这是您的正则表达式的固定版本:

/^\d{4}-\d\d-\d\d(?:t[\d:.]*(?:z|[+-]\d\d:?\d\d)?)?$/i

或者,进一步精确以匹配年月日:

/^[12]\d{3}-(?:0?[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])(?:t[\d:.]*(?:z|[+-]\d\d:?\d\d)?)?$/i

如果最后一个 \d\d:?\d\d 是几分钟和几秒钟,您可以将其替换为 [0-5][0-9]:?[0-5][0-9]

查看regex demoregex graph

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多