Regex para duraciones ISO 8601

Necesito una expresión regular para validar duraciones en elFormato de duración ISO 8601 (con la excepción de partes fraccionarias que no necesito).

PnYnMnDTnHnMnS

PnW

Esto es lo que tengo:

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

El único problema es que las cuerdasP yPT están permitidos con esta expresión regular ya que todas las partes son "cero o uno"?.

Debe haber al menos un componente (fecha u hora)Si hay unT entonces debe haber un componente de tiempo (H, M o S)Si hay unT entonces puede o no haber componentes de fecha (A, M o D)Se permite el desbordamiento (p. Ej.P72H es mayormente equivalente aP3D)

Entradas aceptables:

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

Entradas inaceptables:

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

En este momento, las cadenas no válidas pasan la validación del lado del cliente pero fallan en el lado del servidor porque se pasan aDateInteval pero me gustaría fallar en el lado del cliente si es posible. Si todos usaran Chrome 40+, podría especificarminlength='3' en el elemento de entrada para ayudar, pero desafortunadamente ese no es el caso.

Respuestas a la pregunta(2)

Su respuesta a la pregunta