我正在使用 JavaScript,我需要弄清楚如何使用正则表达式确定有效日期。
比赛将是:
dd-mm-yyyy
dd-mm-yy
此外,不应接受任何前导零,例如:
9-8-2010
10-6-99
我怎样才能写一个正则表达式来做到这一点?
我正在使用 JavaScript,我需要弄清楚如何使用正则表达式确定有效日期。
比赛将是:
dd-mm-yyyy
dd-mm-yy
此外,不应接受任何前导零,例如:
9-8-2010
10-6-99
我怎样才能写一个正则表达式来做到这一点?
我想出了这个:
function isValidDate(inputDate){
var myRegex = /^(\d{1,2})([\-\/])(\d{1,2})\2(\d{4}|\d{2})$/;
var match = myRegex.exec(inputDate);
if (match != null) {
var auxDay = match[1];
var auxMonth = match[3] - 1;
var auxYear = match[4];
auxYear = auxYear.length < 3 ? (auxYear < 70 ? '20' + auxYear : '19' + auxYear) : auxYear;
var testingDate = new Date(auxYear,auxMonth,auxDay);
return ((auxDay == testingDate.getDate()) && (auxMonth == testingDate.getMonth()) && (auxYear == testingDate.getFullYear()));
} else return false;
}
适用于dd-mm-yyyy, dd-mm-yy, d-m-yyyyand d-m-yy,使用-或/作为分隔符
基于此脚本
您最好对-所有元素进行拆分和测试。但如果你真的想使用正则表达式,你可以试试这个:
/^(?:(?:31-(?:(?:0?[13578])|(1[02]))-(19|20)?\d\d)|(?:(?:29|30)-(?:(?:0?[13-9])|(?:1[0-2]))-(?:19|20)?\d\d)|(?:29-0?2-(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))|(?:(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))-(?:(?:0?[1-9])|(?:1[0-2]))-(?:19|20)?\d\d))$/
解释:
^ # start of line
(?: # group without capture
# that match 31st of month 1,3,5,7,8,10,12
(?: # group without capture
31 # number 31
- # dash
(?: # group without capture
(?: # group without capture
0? # number 0 optionnal
[13578] # one digit either 1,3,5,7 or 8
) # end group
| # alternative
(1[02]) # 1 followed by 0,1 or 2
) # end group
- # dash
(19|20)? #numbers 19 or 20 optionnal
\d\d # 2 digits from 00 to 99
) # end group
|
(?:(?:29|30)-(?:(?:0?[13-9])|(?:1[0-2]))-(?:19|20)?\d\d)
|
(?:29-0?2-(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))
|
(?:(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))-(?:(?:0?[1-9])|(?:1[0-2]))-(?:19|20)?\d\d)
)
$
我已经解释了第一部分,剩下的作为练习。
这匹配一个无效日期:29-02-1900但对于01-01-1900和之间的任何日期都是正确的31-12-2099
简单地验证 yyyy-mm-dd hh:MM(24 小时时间):
var dateFormat=/^20\d{2}-(0[1-9]|1[0-2])-[0-3]\d\s([0-1][0-9]|2[0-3]):[0-5]\d$/;
var myDate="2017-12-31";
if ( myDate.match(dateFormat)){
console.log('matches');
};
将第一项 ( 20\d{2} ) 更改为 \d{4} 将允许任何 4 位数的年份,包括 0000 和 9999。此外,此正则表达式强制月、日、小时和分钟前导零。
此正则表达式检查:
此正则表达式不检查:
分步解决方案:
function mDateVerify(date) {
function isLeap(y) {
return (y % 400 === 0 || y % 100 !== 0) && (y % 4 === 0);
}
date = date.match(/^(\d{1,2})-(\d{1,2})-(\d+)$/);
if (date === null) {
return false; // if match failed
}
var year = parseInt(date[3], 10),
month = parseInt(date[2], 10),
day = parseInt(date[1], 10);
if (month > 12) {
return false;
}
if (month === 2) { // February
if (isLeap(year)) {
if (day > 29) {
return false;
}
} else {
if (day > 28) {
return false;
}
}
}
if ((month < 8 && month % 2 === 0) || (month >= 8 && month % 2 === 1)) {
if (day > 30) {
return false;
}
}
if (day > 31) {
return false;
}
return true;
}
我得到了一些结果来验证 mm/dd/yyyy 格式
^(((0[1-9]|1[0-2])/(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])/(29|30)|(0[13578]|1[02])/31)/(?!0000)[0-9]{4}|02/29/([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00))$