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'
на элемент ввода, чтобы помочь, но это не так, к сожалению.