Соответствие регулярному выражению для проверки на действительный год - PullRequest
71 голосов
/ 07 декабря 2010

Учитывая значение, которое я хочу проверить, чтобы проверить, является ли это действительным годом.Мой критерий прост, где значение должно быть целым числом 4 символов.Я знаю, что это не лучшее решение, так как оно не позволит лет до 1000 и позволит годы, такие как 5000.Этот критерий подходит для моего текущего сценария.

Я придумал:

\d{4}$

Хотя это работает и допускает отрицательные значения.

Как я могу гарантировать, что разрешены только положительные целые числа?

Ответы [ 13 ]

152 голосов
/ 07 декабря 2010

Годы от 1000 до 2999

^[12][0-9]{3}$

Для 1900-2099

^(19|20)\d{2}$
69 голосов
/ 07 декабря 2010

Вам необходимо добавить начальный якорь ^ как:

^\d{4}$

Ваше регулярное выражение \d{4}$ будет соответствовать строкам , которые заканчиваются 4 цифрами .Поэтому ввод, такой как -1234, будет принят.

Добавляя начальный якорь, вы сопоставляете только те строки, которые начинаются и заканчиваются с 4 цифрами, что фактически означает, что они должны содержать только 4 цифры.

21 голосов
/ 03 сентября 2012

«Принятый» ответ на этот вопрос является как неправильным, так и близоруким.

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

Это близорукость в том, что не соответствует любым значениям выше 9999. Мы уже забыли уроки Y2K ?Вместо этого используйте регулярное выражение:

^[1-9]\d{3,}$

Если вам нужно сопоставить годы в прошлом, помимо лет в будущем, вы можете использовать это регулярное выражение для сопоставления с любым положительным целым числом:

^[1-9]\d*$

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

Примечание: это регулярное выражение будет соответствовать всем годам, в том числе до года 1, так как они обычно представлены с обозначением BC вместо отрицательного целого числа.Конечно, это соглашение может измениться в течение следующих нескольких тысячелетий, поэтому ваш лучший вариант - сопоставить любое целое число - положительное или отрицательное - со следующим регулярным выражением:

^-?[1-9]\d*$
9 голосов
/ 01 февраля 2015

Это работает с 1900 по 2099:

/(?:(?:19|20)[0-9]{2})/
4 голосов
/ 27 июня 2013

Опираясь на ответ @ r92, за 1970-2019 годы:

(19[789]\d|20[01]\d)
1 голос
/ 11 мая 2018

Использование;

^(19|[2-9][0-9])\d{2}$ 

в течение 1900 - 9999 гг.

Не нужно беспокоиться о 9999 и далее - ИИ будет заниматься всем программированием к тому времени !!!Хе-хе-хе

Вы можете проверить свое регулярное выражение в https://regex101.com/

Также более подробную информацию о группах без захвата (упоминается в одном из комментариев выше) здесь http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm

1 голос
/ 16 апреля 2018

В теории вариант с 4 цифрами правильный. Но на практике может быть лучше иметь диапазон 1900-2099 гг.

Кроме того, это должна быть группа без захвата. Во многих комментариях и ответах предлагается захват группировки, что не является правильным ИМХО. Потому что для сопоставления это может сработать, но для извлечения совпадений с помощью регулярных выражений он извлечет 4-значные и двухзначные (19 и 20) числа также из-за парантеза.

Это будет работать для точного соответствия, используя группы без захвата:

(?:19|20)\d{2}

1 голос
/ 09 июня 2017

Чтобы проверить год в строке, которая содержит другие слова наряду с годом, вы можете использовать следующее регулярное выражение: \ b \ d {4} \ b

1 голос
/ 07 декабря 2010

вы можете использовать sth как [^-]\d{4}$: вы запрещаете ставить знак минус - перед своими 4 цифрами.
вы также можете использовать ^\d{4}$ с ^, чтобы поймать начало строки,На самом деле это зависит от вашего сценария ...

0 голосов
/ 19 июня 2018

Если вам нужно сопоставить ГГГГ или ГГГГММДД, вы можете использовать:

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
...