Regex para durações ISO 8601

Eu preciso de uma expressão regular para validar durações noFormato de duração ISO 8601 (com exceção das partes fracionárias das quais não preciso).

PnYnMnDTnHnMnS

PnW

Aqui está o que eu tenho:

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

O único problema é que as cordasP ePT são permitidos com este regex, pois todas as partes são "zero ou uma"?.

Precisa haver pelo menos um componente (data ou hora)Se houver umT é necessário que haja um componente de tempo (H, M ou S)Se houver umT pode haver ou não componentes de data (Y, M ou D)O estouro é permitido (por exemplo,P72H é principalmente equivalente aP3D)

Entradas aceitáveis:

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

Entradas inaceitáveis:

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

No momento, as cadeias inválidas estão passando pela validação do lado do cliente, mas falham no lado do servidor porque são passadas paraDateInteval mas eu gostaria de falhar no lado do cliente, se possível. Se todo mundo estivesse usando o Chrome 40 ou superior, eu poderia especificarminlength='3' no elemento de entrada para ajudar, mas esse não é o caso, infelizmente.

questionAnswers(2)

yourAnswerToTheQuestion