Регулярное выражение для проверки на допустимый год
учитывая значение, которое я хочу проверить, чтобы проверить, является ли это допустимым годом. Мои критерии просты, где значение должно быть целым числом с 4
символы. Я знаю, что это не лучшее решение, так как это не позволит лет до 1000
и позволит такие годы, как 5000
. Эти критерии адекватны моему текущему сценарию.
что я придумал
d{4}$
в то время как это работает, он также позволяет отрицательные значения.
как я убедитесь, что допускаются только положительные целые числа?
13 ответов
вам нужно добавить начальный якорь ^
as:
^\d{4}$
регулярное выражение \d{4}$
будет соответствовать строки С 4 цифры. Итак, введите как -1234
будут приняты.
добавляя начальный якорь, вы соответствуете только тем строкам, которые begin и End С 4 цифрами, что фактически означает, что они должны содержать только 4 цифры.
"принятый" ответ на этот вопрос является как неправильным, так и близоруким.
неверно, что он будет соответствовать строкам, таким как 0001
, который не является допустимым года.
он близорук в том, что он будет не соответствуют любым значениям выше 9999. Мы уже забыли уроки Y2K? Вместо этого, используйте регулярное выражение:
^[1-9]\d{3,}$
Если вам нужно соответствовать годам в прошлом, в дополнение к годам в будущем, вы можете использовать это регулярное выражение для любого положительного целого числа:
^[1-9]\d*$
даже если вы не ожидаете даты из прошлого, вы можете использовать это регулярное выражение в любом случае, на случай, если кто-то изобретает машину времени и хочет забрать ваше программное обеспечение с собой.
Примечание: это регулярное выражение будет соответствовать всем годам, в том числе до года 1, поскольку они обычно представлены обозначением BC вместо отрицательного целого числа. Конечно, эта конвенция могла бы измените в течение следующих нескольких тысячелетий, поэтому ваш лучший вариант-сопоставить любое целое число-положительное или отрицательное-со следующим регулярным выражением:
^-?[1-9]\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})$