我需要用正则表达式验证格式为dd/mm/yyyy的日期字符串。
这个正则表达式验证dd/mm/yyyy,但不验证像31/02/4500这样的无效日期:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
什么是有效的正则表达式来验证支持闰年的dd/mm/yyyy格式?
我需要用正则表达式验证格式为dd/mm/yyyy的日期字符串。
这个正则表达式验证dd/mm/yyyy,但不验证像31/02/4500这样的无效日期:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
什么是有效的正则表达式来验证支持闰年的dd/mm/yyyy格式?
当前回答
如果您正在寻找特定的格式,这适用于“dd/MM/yyyy”和“dd/MMM/yyyy”日期格式,仅基于Alok答案。
function isValidDateFormatDDMMYYYY(inputDate) {
var date_regex = /^(?:(?:31(\/)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
return date_regex.test(inputDate);
}
一些示例通过这段代码-
isValidDateFormatDDMMYYYY("15/01/1999") //返回True isValidDateFormatDDMMYYYY("15/Jan/1999") //返回True isValidDateFormatDDMMYYYY("15/1/1999") //返回True isValidDateFormatDDMMYYYY("1/15/1999") //返回False
谢谢
其他回答
下面是regex的另一个版本,它可以匹配以下任何日期格式,并允许省略前导零:
Regex: ^(0 - 3) ?[0 - 9][0 - 3] ?[0 - 9]。(?:[0 - 9]{2})?[0 - 9] {2} $
匹配:
1/1/11或1.1.11或1-1-11:true 01/01/11或01.01.11或01-01-11:true 01/01/2011或011.01.2011或01-01-2011:true 01/1/2011或01.1.2011或01-1-2011:true 1/11/2011或1.11.2011或1-11-2011:true 1/11/11或1.11.11或1-11-11:true 11/1/11或11.1.11或11-1-11:true
Debuggex演示
我认为最好的方法是使用Moment.js的isValid()方法,指定格式并使用严格的解析。
正如moment.js文档所说
从2.3.0版本开始,您可以为最后一个参数指定一个布尔值 使Moment使用严格解析。严格解析要求 格式和输入完全匹配,包括分隔符。
value = '2020-05-25';
format = 'YYYY-MM-DD';
moment(value, format, true).isValid() // true
我知道这个问题已经有很长时间没有回答了,但也许这可以帮助到其他人。问题是,我也想检查年份,让一些过去的年份也匹配。这个正则表达式匹配日期格式为“DD-MM-YYYY”。所以这个函数将返回一个正则表达式:
const check_year = "01-01-2021" console.log(get_regex()) console.log(check_year.match(get_regex())) function get_regex(){ let actual_year = `${new Date().getFullYear()}` let regex = new RegExp() let split_year = actual_year.split("") let year_regex = `${split_year[0]}[0-${split_year[1]}][0-${split_year[2]}][0-${split_year[3]}]$` let day_month_regex = "^([1-2][0-9]|3[0-1]|0?[1-9])[-]([1][0-2]|0?[1-9])[-]" regex.compile(day_month_regex+year_regex, "g") return regex }
在这里找到这个reg ex
^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$
这将正确地验证mm/dd/yyyy格式和有效日期(但不是m/d/yyyy)。
一些测试
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"
是否会在1900-2099年之间生效