OK, you requested a regular expression. Here. I immediately think that it is not recommended to check the date with a regular expression:
Firstly, a detailed, commented version, at least, makes it clear that this beast is possible:
^ # start of string (?: # either match... (?: (?: # 31st day of all allowed months (?:(?:0?[13578]|1[02])/31) | # or (?:(?:0?[13-9]|1[0-2])/(?:29|30)) ) # 29th/30th day of any month except February / # plus any year since 1600 (?:1[6-9]|[2-9]\d) \d{2} ) | # or (?: # match Feb 29th 0?2/29/ (?: # in all leap years since 1600 (?: (?: # century 1[6-9]|[2-9]\d ) (?: # two-digit years divisible by four, not ending in 00 0[48] | [2468][048] | [13579][26] ) | (?: # all the leap years ending in 00 (?:16|[2468][048]|[3579][26]) 00 ) ) ) ) | # or (?: # (for any month) (?:0?[1-9]) | (?:1[0-2]) ) / (?: # match the 1st-28th day 0?[1-9]|1\d|2[0-8] ) / (?: (?:1[6-9]|[2-9]\d)\d{2} ) )$
Or, if you cannot use verbose regular expressions in ASP.NET validators:
^(?:^(?:(?:(?:(?:(?:0?[13578]|1[02])/31)|(?:(?:0?[13-9]|1[0-2])/(?:29|30)))/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2/29/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))/(?:0?[1-9]|1\d|2[0-8])/(?:(?:1[6-9]|[2-9]\d)\d{2}))$)$
They allow, but do not require an initial zero in one-bit months / days. If you do not want this, replace all instances of 0? by 0 .
source share