我有以下(工作)正则表达式,它检查我,字符串是否是有效日期:
(?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(-)(?:0?2\1(?:29)))|(?:(?:[1-9]\d{3})(-)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8])))))
适用于这样的日期:07.12.2017
现在我想补充一点,该字符串也有一个检查正确性的时间。
我希望检查07.12.2017, 06:13
的有效性。
我在前面的正则表达式(上面)中添加了这个表达式:
, ([0-1]?[0-9]|2[0-3]):[0-5][0-9]
但它不起作用。 谁能指出我,我做错了什么?
答案 0 :(得分:0)
在我回答这个问题之前,我想说除了使用正则表达式之外,还有更好的方法可以验证这一点,因为二月不是简单的月份才能做到正确,有些年份它会有28天,有些则是将有29天,它也不仅仅是"每四年2月将有29天"无论是。在2100年,你会期望在这个借口下成为闰年,但事实并非如此,因为它不能被400整除。
你最好使用一个实际的日期库,因为在日期方面有很多变量,正则表达式只是一个糟糕的工具。
有了这个,我的回答是:
(?:(?:(?:[0-2]\d)\.(?:0\d|1[12]))|(?:30\.(?:0[469]|11))|(?:3[01]\.(?:0[13578]|1[02])))\.\d+(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$
这应该与您希望的格式匹配日期。
请参阅Regex101
修改强>
我只是搞了一下正则表达式以更好地为此提供功能。此函数将对闰年进行双重检查,并返回一个布尔值,表示日期是否有效。
function isValidDate(date) {
let regex = /^(?:((?:[0-2]\d)\.(?:0\d|1[12]))|(30\.(?:0[469]|11))|(3[01]\.(?:0[13578]|1[02])))\.(\d+)(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$/,
matches = date.match(regex);
if (!matches) {
return false;
}
let dayMonth = matches[1] || matches[2] || matches[3],
year = matches[4],
valid = !dayMonth || !year ? false : true;
if (dayMonth == "29.02") {
let divisibleBy = {four: year % 4 === 0, oneHundred: year % 100 === 0, fourHundred: year % 400 === 0 };
if (year > 400) {
if (!divisibleBy.four) {
valid = false;
}
if (divisibleBy.four && divisibleBy.oneHundred && !divisibleBy.fourHundred) {
valid = false;
}
}
}
return valid;
}
console.log(
isValidDate("29.02.2100"),
isValidDate("29.02.2000"),
isValidDate("25.12.2017, 22:00"),
isValidDate("31.05.1678"),
isValidDate("32.05.1900"),
isValidDate("29.02.32000, 06:15")
)