Регулярное выражение, проверяющее, является ли строка в формате "гггг / мм / дд" действительной датой, включая границы месяца - PullRequest
0 голосов
/ 21 марта 2009

Я пытаюсь проверить дату в c # в формате "гггг / мм / дд". Можно ли даже (с помощью регулярных выражений) подтвердить, что в феврале нет 30 дней?

Ответы [ 5 ]

8 голосов
/ 21 марта 2009

Это можно сделать с помощью регулярного выражения, но это будет невероятно сложно. Мне довольно удобно писать регулярные выражения, но я бы не использовал это решение для проверки дат.

Гораздо проще использовать другое решение для проверки дат. Для каждого языка программирования доступны компоненты проверки даты. Я не пользователь .NET, но при быстром поиске я нахожу класс DateTime, который, кажется, делает это.

См. Руководство разработчика .NET Framework, " Разбор строк даты и времени ."

7 голосов
/ 21 марта 2009

Как уже говорили другие, регулярное выражение - не лучший подход, если только вы не вынуждены (например, по причинам JavaScript на стороне клиента).

Я предлагаю вам использовать DateTime.TryParseExact с шаблоном "гггг / мм / дд".

3 голосов
/ 21 марта 2009

Да, это возможно, но это довольно долго. Шаблон только для проверки месяцев и дней имеет довольно много вариаций, и все это нужно повторять для високосных лет.

В качестве примера, вот пример из Блог Regex Майкла Эша для формата мм / дд / гггг:

^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?: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])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
2 голосов
/ 21 марта 2009

Это возможно сделать. Это возможно даже в течение високосных лет, но это будет сложно.

Простое выражение для этого формата даты:

^\d{4}/\d{2}/\d{2}$

Более сложное выражение, которое учитывает количество дней в месяце (но число дней в году все еще позволяет 29 дней в году):

^\d{4}/(?:02/(?:0[1-9]|[12]\d)|(?:0[13578]|1[02])/(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)/(?:0[1-9]|[12]\d|30))$

Но, вероятно, было бы проще сделать это с помощью встроенной функции C #.

0 голосов
/ 21 марта 2009

Возможно, но високосный год будет очень сложным, поэтому вы можете захотеть заняться чем-то другим, кроме регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...