Regex für ISO 8601-Dauern

Ich benötige einen regulären Ausdruck, um die Dauer im @ zu überprüfe ISO 8601 Dauerformat (mit Ausnahme von Bruchteilen, die ich nicht brauche).

PnYnMnDTnHnMnS

PnW

Hier ist was ich habe:

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

as einzige Problem ist, dass die ZeichenfolgenP undPT sind mit diesem regulären Ausdruck zulässig, da alle Teile "null oder eins" sind?.

Es muss mindestens eine Komponente vorhanden sein (Datum oder Uhrzeit)Wenn da ein ... istT dann muss es eine Zeitkomponente geben (H, M oder S)Wenn da ein ... istT dann kann es Datumskomponenten geben oder nicht (Y, M oder D)in Überlauf ist zulässig (z. B.P72H entspricht größtenteilsP3D)

Akzeptable Eingaben:

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

Unakzeptable Eingaben:

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

Im Moment bestehen die ungültigen Zeichenfolgen die clientseitige Überprüfung, schlagen jedoch serverseitig fehl, da sie an @ übergeben werdeDateInteval aber ich würde gerne auf der Client-Seite scheitern, wenn möglich. Wenn jeder Chrome 40+ verwenden würde, könnte ich @ angebeminlength='3' auf dem Eingabeelement zu helfen, aber das ist leider nicht der Fall.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage