Мне нужно регулярное выражение для проверки продолжительности в ISO 8601 duration format (за исключением дробных частей, которые мне не нужны).Regex для 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'
на элемент ввода, чтобы помочь, но к сожалению это не так.
Вы можете установить длину мин в виде '^ (= {3,} $?.) Р (\ д + Y)? (\ d + М)? (\ d + W)? (\ D + D)? (Т (\ д + Н) + (\ д + М)? (\ d + S)?)? $ '. –
@stribizhev Это будет охватывать только некоторые случаи, так как «P4DT» все равно может быть введен. Также любая причина для downvote? –
@stribizhev Два очевидных уже были разделены 'P' и' PT'. Я отредактировал, чтобы уточнить, пожалуйста, дайте мне знать, если есть что-то еще, что я могу добавить. –