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

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

что я придумал

d{4}$

в то время как это работает, он также позволяет отрицательные значения.

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

13 ответов


вам нужно добавить начальный якорь ^ as:

^\d{4}$

регулярное выражение \d{4}$ будет соответствовать строки С 4 цифры. Итак, введите как -1234 будут приняты.

добавляя начальный якорь, вы соответствуете только тем строкам, которые begin и End С 4 цифрами, что фактически означает, что они должны содержать только 4 цифры.


лет от 1000 до 2999

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

для 1900-2099

^(19|20)\d{2}$

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

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

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

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

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

^[1-9]\d*$

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

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

^-?[1-9]\d*$

это работает для 1900 до 2099:

/(?:(?:19|20)[0-9]{2})/

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

(19[789]\d|20[01]\d)

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


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

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

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

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


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


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

работает с 1900 по 9999


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


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


использовать;

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

за годы 1900 - 9999.

Не нужно беспокоиться за 9999 и далее-A. I. будет делать все Программирование к тому времени !!! Hehehehe

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

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


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

^((?:(?:(?:(?:(?:[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})$