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


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.