Регулярное выражение для соответствия диапазону дат - PullRequest
4 голосов
/ 22 сентября 2009

Есть ли у кого-нибудь идеи о том, можно ли / как создать регулярное выражение, соответствующее дате в любом заданном периоде?

Два примера:

23/11/2008 - 12/04/2010

//The expression would evaluate whether 16/04/2010 was in this range, and return false.
//The expression would determine whether 03/12/2009 was in this range, and return true.

и

01/09/1984 - 30/04/2001

//The expression would evaluate whether 16/04/1990 was in this range, and return true.
//The expression would determine whether 03/12/2009 was in this range, and return false.

Я ломал голову над тем, как что-то придумать, но у меня нет ничего подходящего. Примеры в Интернете интересуют только проверку того, находится ли дата в определенном формате, но не о проверке диапазонов.

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

Ответы [ 7 ]

16 голосов
/ 22 сентября 2009

Не проще ли разобрать строки в DateTime с и сравнить их?

8 голосов
/ 22 сентября 2009

Я не думаю, что вы должны использовать регулярные выражения для проверки диапазона. Сначала проверьте правильность даты с помощью регулярного выражения, затем проверьте, попадает ли она в указанный период.

6 голосов
/ 22 сентября 2009

незнаю ...

Используйте регулярное выражение для извлечения даты, а затем сравните ее с диапазоном. Это будет НАМНОГО проще, чем создание регулярного выражения для соответствия диапазону дат ...

Это классический пример знаменитой цитаты "... и тогда у вас есть 2 проблемы";)

4 голосов
/ 22 сентября 2009

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

Для диапазона 23/11/2008 - 12/04/2010 вы должны сначала разделить его на три диапазона для первого года, прошлого года и нескольких лет. Затем вы будете делить каждый год на месяцы с одинаковым количеством дней в них. Затем вы делите диапазоны дат для длины каждого месяца на десятки (например, 01-09, 10-19, 20-28). Из этого вы можете создать регулярное выражение, как:

^(2[3-9]|30)/11/2008|
(0[1-9]|[12]\d|3[01])/12/2008|
(0[1-9}|1\d|2[0-8])/02/2009|
(0[1-9]|[12]\d|3[01])/(0[13578]|1[02])/2009|
(0[1-9]|[12]\d|30)/(0[469]|11)/2009|
(0[1-9}|1\d|2[0-8])/02/2010|
(0[1-9]|[12]\d|3[01])/0[13]/2010|
(0[1-9]|1[0-2])/04/2010$
0 голосов
/ 23 августа 2012

выражений, не проверять правильность дат

01/09/1984 - 30/04/2001

^\d\d/(09|1[012])/1984|
\d\d/\d\d/(198[5-9]|199\d|2000)|
\d\d/0[1-3]/2001|
(0[1-9]|[12]\d|30)/04/2001$

23/11/2008 - 12/04/2010

^(2[3-9]|30)/11/2008|
\d\d/12/2008|
\d\d/\d\d/2009|
\d\d/0[1-3]/2010|
(0[1-9]|1[0-2])/04/2010$
0 голосов
/ 22 сентября 2009

Посмотрите на DateTime.ParseExact, чтобы превратить строку в дату, а затем использовать их как обычные диапазоны DateTime. Регулярное выражение будет ужасно, если это возможно !!

0 голосов
/ 22 сентября 2009

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

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