Как написать регулярное выражение для проверки формата даты? - PullRequest
2 голосов
/ 18 июня 2019

Я написал регулярное выражение, как показано ниже:

/^(\d{4}\-\d\d\-\d\d)|(\d{4}\-\d\d\-\d\d([tT][\d:\.]*){1})([zZ]|([+\-])(\d\d):?(\d\d))?$/.test("1995-01-01")

Работает нормально, но даже если я укажу неправильный формат, также верните true в качестве значения, см. Скриншот ниже:

tt

Ответы [ 2 ]

5 голосов
/ 18 июня 2019

Попробуйте это:

const regex = /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$)/;

console.log(regex.test('1995-01-01')) //true
console.log(regex.test('1995-01-016')) //false

enter image description here

2 голосов
/ 18 июня 2019

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

Быстрое исправление будет

^(?:(\d{4}-\d\d-\d\d)|(\d{4}-\d\d-\d\d([tT][\d:.]*))([zZ]|([+-])(\d\d):?(\d\d))?)$
 ^^^                 ^                                                          ^

См. это демонстрационное выражение регулярного выражения .

Однако, поскольку обе альтернативы начинаются с одного и того же шаблона, имеет смысл записать его как common_prefix(?:second_alternative_part_after_prefix)?.

У вас также есть много групп в шаблоне, которые кажутся избыточными, как и квантификатор {1}, который никогда не нужен в шаблоне.

Вот фиксированная версия вашего регулярного выражения:

/^\d{4}-\d\d-\d\d(?:t[\d:.]*(?:z|[+-]\d\d:?\d\d)?)?$/i

Или, уточнив его далее, чтобы он соответствовал году-месяцу-дням:

/^[12]\d{3}-(?:0?[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])(?:t[\d:.]*(?:z|[+-]\d\d:?\d\d)?)?$/i

Если последние \d\d:?\d\d указаны для минут и секунд, вы можете заменить его на [0-5][0-9]:?[0-5][0-9].

См. Демонстрационный пример регулярных выражений и график регулярных выражений :

enter image description here

enter image description here

...