Regex для продолжительности ISO 8601

Мне нужно регулярное выражение для проверки продолжительности вФормат продолжительности ISO 8601 (за исключением дробных частей, которые мне не нужны).

PnYnMnDTnHnMnS

PNW

Вот что у меня есть:

^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

Единственная проблема заключается в том, что строкиP а такжеPT разрешены с этим регулярным выражением, так как все части "ноль или один"?.

Там должен быть хотя бы один компонент (дата или время)Если естьT тогда должен быть временной компонент (H, M или S)Если естьT тогда могут быть или не быть какие-либо компоненты даты (Y, M или D)Переполнение разрешено (например,P72H в основном эквивалентноP3D)

Допустимые входные данные:

P1Y        // date component only
P2MT30M    // date and time components
PT6H       // time component only
P5W        // another date component

Недопустимые входные данные:

P         // no components
PT        // no components
P3MT      // T specified but not time components

Сейчас недопустимые строки проходят проверку на стороне клиента, но не на стороне сервера, потому что они передаются вDateInteval но я хотел бы потерпеть неудачу на стороне клиента, если это возможно. Если бы все использовали Chrome 40+, я мог бы указатьminlength='3' на элемент ввода, чтобы помочь, но это не так, к сожалению.

Ответы на вопрос(2)

Ваш ответ на вопрос