Соответствие регулярному выражению для проверки в течение допустимого года


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

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

d{4}$

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

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

13 58

13 ответов:

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

^\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.

кроме того, это должна быть группа без захвата. Многие комментарии и ответы предлагают захватить группировку, которая не является правильным ИМХО. Потому что для сопоставления он может работать, но для извлечения совпадений с помощью регулярного выражения он будет извлекать 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})$