регулярное выражение для високосного года очень сложное: наглядный пример: (это также включает проверку полной даты)
"(((\\d\\d)(0[48]|[2468][048]|[13579][26])|([02468][048]|[13579][26])(00))(02)([012]\\d))|(\\d\\d([02468][1235679]|[13579][01345789])(02)([01]\\d|2[012345678]))|(\\d\\d\\d\\d((0[13578]|1[02])([012]\\d|3[01])|((0[46]|11)([012]\\d|30))))"
первый раздел выделяет общий случай с не заканчивающимся на 00
во втором разделе указан год столетия, поэтому только годы, кратные 400, являются високосными (1900 не високосный год)
затем в последнем разделе он обрабатывает все остальные месяцы
(я на самом деле не проверял это, но он должен работать достаточно близко)