Возможно, это семантика, но эту часть спецификации SCORM можно интерпретировать как означающую, что литералы разрешены, даже если значение не указано:
Обозначения литералов символов P,
Y, M, D, T, H, M и S должны появиться, если
соответствующее ненулевое значение
нет.
«должен появиться», означая, что литерал ДОЛЖЕН присутствовать, если присутствует соответствующий номер; он не говорит «ТОЛЬКО появится», если присутствует соответствующий номер.
Я изменил регулярное выражение Алана, чтобы справиться с этой возможностью (спасибо, Алан):
^P(?:\d+Y|Y)?(?:\d+M|M)?(?:\d+D|D)?(?:T(?:\d+H|H)?(?:\d+M|M)?(?:\d+(?:\.\d{1,2})?S|S)?)?$
Единственная ошибка, которую я обнаружил до сих пор, - это неспособность пометить строку, для которой не указаны числовые значения, например, 'PTS'. Минимум в соответствии со спецификацией - «P», за которым следует одно значение и соответствующее обозначение, например, P1Y (= 1 год) или PT0S (= 1 секунда):
хотя бы один символьный литерал
обозначение и значение должны присутствовать
в дополнение к обозначению P
Должен быть способ добавить проверку на числовое значение к этому регулярному выражению, но мое регулярное выражение не настолько сильное. :)