Как уже упоминалось, регулярные выражения почти наверняка не то, что вы хотите.Но, сказав, что, если вы действительно хотите регулярное выражение, вот как оно построено:
31 день месяцев
(0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2}
30 дней месяцев
(0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2}
Февраль 1-28 всегда действителен
(02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2}
29 февраля также действителен в високосные годы
(02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000)
, что означает, что это будет так, если сложить все вместе:
((0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2})|((0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2})|((02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))
Эта версия немного короче, но немного сложнее для понимания.
((0[13578]|1[02])[\/.]31[\/.](18|19|20)[0-9]{2})|((01|0[3-9]|1[1-2])[\/.](29|30)[\/.](18|19|20)[0-9]{2})|((0[1-9]|1[0-2])[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))
Эти сценарии длинные и не поддерживаются.Должно быть ясно, что это не очень хорошая идея, но она возможна.
Предостережения:
- диапазон 1800-2099 (еще можно добавить без особых затруднений, нотребует изменений в 4-6 разрозненных местах)
- требует двухзначных месяцев и дней (строгость может быть удалена из выражения в ~ 8 местах)
[\/.]
в качестве разделителей (8 мест) - Не был протестирован (мы могли бы проверить его по всем комбинациям цифр и сравнить с функцией даты javascript? [Доказательство того, что мы заново изобретаем колесо])