Соответствие регулярного выражения для проверки действительного года

89

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

Я придумал

\d{4}$

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

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

Ранхиру Джуд Курай
источник
fwiw Я создал проект node.js to-regex-range для автоматического создания этих диапазонов. Это сложнее, чем может показаться, если вам нужно сгенерировать регулярное выражение для тестирования в течение ряда лет.
jonschlinkert
Зачем ограничивать срок действия 4-значным годом? longnow.org
Дан Темпл

Ответы:

76

Вам нужно добавить начальную привязку ^как:

^\d{4}$

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

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

codaddict
источник
2
Черт! Моя была настолько несовершенной, что ее даже приняли бы whateverblahblah2323. Теперь я понимаю, почему небольшое обучение опасно: О
Ранхиру Джуд Курай
62
Это сломается в 10 000 году.
сферик 03
16
@sferik: Неважно. В оригинальном плакате прямо говорилось, что он хочет проверить четыре символа. Он не заявлял, что хочет, чтобы год 10 000 был действительным вводом, поэтому принятие 10000было бы ошибкой.
Markusk
4
@sferik: К тому времени программы уже не будет на века. Если нет, то лучше всего беспокоиться о будущем 9000 лет. Следуя принципу ЯГНИ, подход действителен.
Фил
182

Годы с 1000 по 2999

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

На 1900-2099 гг.

^(19|20)\d{2}$
r92
источник
14
Это гораздо лучшее решение
mk_89
10
Лучше использовать группу без захвата:^(?:19|20)\d{2}$
Эльдар Агаларов,
Как мне подтвердить четырехзначный год между 2011 и 2099 годами?
mcquaim
Как я могу добавить (19|20)\d{2}в свое регулярное выражение, чтобы проверить формат даты рождения? Это мое регулярное выражение, /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/я хочу, чтобы год всегда
состоял из
Используйте ^ (19 | 2 [0-9]) \ d {2} $ для лет 1900 - 2999
MarcoZen
22

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

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

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

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

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

^[1-9]\d*$

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

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

^-?[1-9]\d*$
сферик
источник
3
Нет, скорее всего, не будет. Но кому-то (археологу? Историку?), Возможно, потребуется сопоставить годы с 8000-летней давностью. : D И Доку Брауну это может понадобиться ...
Хайме
1
Я использовал это, чтобы ограничить диапазон от 1000-9999 ^ [1-9] \\ d {3} $, потому что приложение,
которому
Отличный ответ. Я бы сделал следующее, чтобы принять год 0: ^ (-? [1-9] \ d * | 0) $
Коста Контос
10

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

/(?:(?:19|20)[0-9]{2})/
Jonschlinkert
источник
мне кажется, что он будет идти только до 2099. Кстати, OP спрашивает, как разрешить только положительное 4-значное число.
DeanOC
бах, 2099 - вот что я имел в виду. Спасибо. и теперь я вижу положительную часть целых чисел.
jonschlinkert 01
Я создал проект to-regex-range для автоматического создания этих диапазонов
jonschlinkert
5

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

(19[789]\d|20[01]\d)
Renaud
источник
Ваш ответ позволяет197999
avalanche1
Я не думаю, что это так ... Первая часть регулярного выражения соответствует номеру, начинающемуся с 19, затем любому из 7,8 или 9, за которым следует ОДИН номер. Регулярное выражение 19[789]\d\d\dпозволит197999
Renaud
1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche1
да, он будет соответствовать первым 4 числам ( 1970), а не последним 3. Что насчет (19[789]\d|20[01]\d)[^0-9]? Это будет совпадать, 1970 324но нет1970324
Renaud
1
Я нашел это полезным для поиска года фильма по имени файла ... в данном случае нам нужны материалы, начиная с 1930-х годов ... но затем мы исключаем 1024, которые добавляются в конце для качества видео
Адриан Хам,
2

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

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

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

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

Адиль Алиев
источник
1

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

PierrOz
источник
1

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

Dhyey
источник
Это было именно то, что мне нужно, принятый ответ не кажется правильным PCRE.
Прометей
1

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

^(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

MarcoZen
источник
0

Вы можете преобразовать целое число в строку. Поскольку знак минус не будет соответствовать цифрам, у вас не будет отрицательных лет.

Комрадин
источник
0

Я использую это регулярное выражение в Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

Работает с 1900 по 9999 гг.

R2Rivs
источник
0

/ ^ \ d {4} $ / Это проверяет, состоит ли строка только из 4 чисел. В этом сценарии для ввода 989 ​​года вы можете вместо этого ввести 0989.

Dayz
источник
0

Если вам нужно сопоставить YYYY или YYYYMMDD, вы можете использовать:

^((?:(?:(?:(?:(?:[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})$
Бенджамин Гудакр
источник
0

Вы также можете использовать это.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
Ранджит Чоухан
источник
Они хотят соответствовать только году. Более того ваши регулярные выражения матчей 00/00/2000или 31/02/1999и еще много ложных дат.
Toto
Может вам помочь ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01 ] \ d)
Ранджит Чохан
(0[1-9]|1[0-2])это гораздо лучшее выражение для месяца
EZ-C