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

时间:2019-06-18 09:54:43

标签: javascript regex regex-group

我写了如下正则表达式:

/^(\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作为值,请参考以下屏幕截图:

tt

2 个答案:

答案 0 :(得分:5)

尝试一下:

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

enter image description here

答案 1 :(得分: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

enter image description here

enter image description here