如何编写用于日期格式验证的正则表达式?

How to write regex for date format validation?

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

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

它工作正常但即使我给出了错误的格式也 return 正确的值请参考下面的截图:

试试这个:

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

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

快速解决方法是

^(?:(\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

或者,进一步精确匹配 year-month-days:

/^[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 demo and the regex graph: