Всего сумасшествие (лет 0-9999)
Следующая один (на основе this ответа) работает на протяжении многих лет между 0 и 9999.
(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))0229)|(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)
(проверьте demo)
Общее безумие упрощено (годы 2000-2099)
Если вы хотите, вы можете упростить его для работы только в течение многих лет в период между 2000 и 2099
(?<!\d)(?:(?:20\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)
Но как вы можете видеть, что это на самом деле не более просто.
(проверьте demo)
здравомыслящий путь (лет) *
Чтобы сохранить здравомыслие, вы должны придерживаться очень простого регулярного выражения, а затем проверить его с помощью кода.
(20\d{2})(\d{2})(\d{2})
(проверьте demo)
Это не будет можно исключить «2/29», если это не високосный год с регулярным выражением. По крайней мере, не в здравом смысле. После этого вам придется разобрать это. Есть ли проблема с '\ d {8}'? Или, по крайней мере, '20 \ d {2} [01] \ d [0123] \ d'? –
@JoeWang На каком языке вы используете? C++ имеет функциональность для этого встроенного, без использования regex –
ahh ... как re может достичь этого ... просто сделайте 5-минутное исследование того, что будет, позволит вам управлять этой возможностью. – HuStmpHrrr