Матч регулярних виразів для перевірки на дійсний рік


89

Отримавши значення, я хочу перевірити його, щоб перевірити, чи є дійсним рік. Мої критерії прості, коли значення має бути цілим числом із 4символами. Я знаю, що це не найкраще рішення, оскільки воно не дозволить роками раніше 1000і дозволить такі роки як 5000. Цей критерій адекватний моєму поточному сценарію.

Те, що я придумав, так це

\d{4}$

Хоча це працює, він також допускає від’ємні значення.

Як я можу переконатись, що дозволено лише додатні цілі числа?


fwiw Я створив проект node.js для регулярного виразу для автоматичного створення цих діапазонів. Це складніше, ніж може здатися, якщо вам потрібно створити регулярний вираз для тестування протягом ряду років.
jonschlinkert

Навіщо обмежувати вашу перевірку 4-значними роками? longnow.org
Ден Темпл

Відповіді:


76

Вам потрібно додати стартовий якір ^як:

^\d{4}$

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

Додаючи початковий прив'язок, ви поєднуєте лише ті рядки, які починаються і закінчуються 4 цифрами, що фактично означає, що вони повинні містити лише 4 цифри.


2
Блін! Мій був настільки вадним, що навіть прийняв би whateverblahblah2323. Тепер я розумію, чому невелике навчання небезпечне: О
Ранхіру Джуд Курей

62
Це зламається в 10000 році.
sferik

16
@sferik: Неважливо. В оригінальному плакаті було зазначено, що він хоче перевірити наявність чотирьох символів. Він не заявив, що бажає, щоб 10000 років був дійсним, тому прийняття 10000було б помилкою.
markusk

4
@sferik: Програми до того часу вже не буде. Якщо ні, найкраще хвилюватися про 9000 років у майбутньому. Дотримуючись принципу YAGNI, підхід є дійсним.
Філ

182

Роки від 1000 до 2999

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

На 1900-2099рр

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

14
Це набагато краще рішення
mk_89

10
Мені краще використовувати групу, яка не захоплює:^(?:19|20)\d{2}$
Ельдар Агаларов

Як я можу перевірити 4-значний рік між 2011 і 2099 роками?
mcquaim

Як я можу додати (19|20)\d{2}свій регулярний вираз, щоб перевірити формат дати народження? Це мій регулярний вираз, /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/я хочу переконатися, що рік завжди має 4 цифри і починається в’янути 19 ** або 20 **
ltdev

Використовуйте ^ (19 | 2 [0-9]) \ d {2} $ для 1900 - 2999 років
MarcoZen

22

"Прийнята" відповідь на це питання є одночасно неправильною і короткозорою.

Невірно, що він буде відповідати рядкам типу 0001, що не є дійсним роком.

Це короткозоро, оскільки воно не буде відповідати жодним значенням вище 9999. Ми вже забули уроки Y2K ? Натомість використовуйте регулярний вираз:

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

Якщо вам потрібно збігти роки минулого, окрім років майбутнього, ви можете використати цей регулярний вираз для відповідності будь-якому додатному цілому числу:

^[1-9]\d*$

Навіть якщо ви не очікуєте дат минулого, ви все одно можете використовувати цей регулярний вираз, на всякий випадок, якщо хтось винайде машину часу і захоче взяти з собою ваше програмне забезпечення.

Примітка: Цей регулярний вираз буде відповідати всім рокам, включаючи ті, що були до 1 року, оскільки вони, як правило, представлені позначенням BC замість цілого від'ємного числа. Звичайно, ця конвенція може змінитися протягом наступних кількох тисячоліть, тому найкращим варіантом є відповідність будь-якого цілого числа - позитивного чи негативного - з таким регулярним виразом:

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

3
Ні, швидше за все не буде. Але комусь (археологу? Історику?), Можливо, знадобиться збіг років 8000 років тому. : D І Доку Брауну це може знадобитися ...
Хайме,

1
я використовував це для обмеження діапазону від 1000-9999 ^ [1-9] \\ d {3} $, тому що додаток, до якого ми маємо надавати дані, приймає лише 4-
значні

Чудова відповідь. Я б зробив так, щоб прийняти і рік 0: ^ (-? [1-9] \ d * | 0) $
Коста Контос

10

Це працює з 1900 по 2099 рік:

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

мені здається, це піде лише на 2099 рік. До речі, ОП запитує, як дозволити лише позитивне 4-значне число.
DeanOC

бах, я мав на увазі 2099 рік. Дякую. і тепер я бачу позитивні цілі числа.
jonschlinkert

Я створив проект to-regex-range для автоматичного створення цих діапазонів
jonschlinkert

5

Спираючись на відповідь @ r92, за 1970-2019 роки:

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

Ваша відповідь дозволяє197999
лавина1

Я не думаю, що це так ... Перша частина регулярного виразу відповідає номеру, що починається з 19, потім будь-якому з 7,8 чи 9, за яким слідує ОДИНЕ число. Регулярний вираз 19[789]\d\d\dдозволить197999
Рено

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
лавина1

так, він буде відповідати першим 4 числам ( 1970), а не останнім 3. Що з цим (19[789]\d|20[01]\d)[^0-9]? Це відповідало б, 1970 324але ні1970324
Рено

1
Я знайшов це корисним для пошуку року фільму за назвою файлу ... у цьому випадку ми хочемо речі з 1930-х років ... але тоді ми виключаємо 1024, який додано до кінця для якості відео
Адріан Хам,

2

Теоретично правильним є варіант із 4 цифр. Але на практиці може бути краще мати діапазон 1900-2099.

Крім того, це повинна бути група, яка не фіксує. Багато коментарів та відповідей пропонують фіксувати групування, що не є належним IMHO. Оскільки для узгодження це може працювати, але для вилучення збігів за допомогою регулярного виразу він витягне 4-значні числа та двоцифрові (19 та 20) числа також через парантез.

Це буде працювати для точного збігу з використанням груп, які не фіксують:

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


1

ви можете піти зі sth як [ ^-]\d{4}$: ви запобігаєте знаку мінус -стояти перед вашими 4 цифрами.
Ви можете також використовувати ^\d{4}$з ^зловити початок рядка. Це насправді залежить від вашого сценарію ...


1

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


Це було саме те, що мені потрібно, прийнята відповідь, здається, не є дійсною 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


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 рік


0

/ ^ \ d {4} $ / Це перевірить, чи містить рядок лише 4 числа. У цьому випадку для введення 989 року замість цього можна вказати 0989.


0

Якщо вам потрібно зіставити РРРР або РРРРММДД, ви можете використовувати:

^((?:(?:(?:(?:(?:[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багато інших помилкових дат.
Тото

Is може вам допомогти ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01 ] \ d)
Ranjeet Chouhan

(0[1-9]|1[0-2])є набагато кращим виразом для місяця
EZ-C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.