我写了如下正则表达式:
/^(\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作为值,请参考以下屏幕截图:
答案 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
答案 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]
。