Проблема с текущим регулярным выражением состоит в том, что у вас есть два чередования, каждое из которых привязано только на одной стороне, первое в начале и последнее в конце.
Быстрое исправление будет
^(?:(\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](https://i.stack.imgur.com/uTMLG.png)
![enter image description here](https://i.stack.imgur.com/h4inD.png)