Соответствие регулярному выражению для проверки в течение допустимого года
учитывая значение, я хочу проверить его, чтобы проверить, если это действительный год. Мои критерии просты, где значение должно быть целым числом с 4
символы. Я знаю, что это не лучшее решение, как это не позволит лет до 1000
и позволит лет, такие как 5000
. Этот критерий адекватен моему текущему сценарию.
то, что я придумал это
d{4}$
в то время как это работает, он также позволяет отрицательные значения.
как я убедитесь, что разрешены только положительные целые числа?
13 ответов:
вам нужно добавить начальный якорь
^
как:^\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.
кроме того, это должна быть группа без захвата. Многие комментарии и ответы предлагают захватить группировку, которая не является правильным ИМХО. Потому что для сопоставления он может работать, но для извлечения совпадений с помощью регулярного выражения он будет извлекать 4-значные числа и двухзначные (19 и 20) числа также из-за парантеза.
Это будет работать для точного соответствия с помощью не захвата группы:
(?: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})$