Как мне преобразовать длительность ISO 8601 в форматированную строку в Lua?

Недавно я использовал Youtube API v3 (да, я знаю, что он не предназначен для Lua), но когда мне нужно преобразовать продолжительность ISO 8601 в форматированную строку, ничто в Интернете не помогает. Я везде гуглил, чтобы найти конкретную библиотеку, которая могла бы помочь с такими вещами, но, к сожалению, для Lua НИ ОДНОЙ. Существуют тысячи библиотек для других языков, кроме Lua.

И теперь, кажется, я застрял со строковыми шаблонами, которые я даже не знаю, как использовать. Так как же еще я мог бы выполнить эту задачу?

Пример продолжительности ISO 8601: PT3M33S

Я хочу преобразовать его во что-то вроде этого: 3:33


person Keanu73    schedule 03.02.2017    source источник
comment
Вы смотрели luarocks.org/modules/tieske/date?   -  person greatwolf    schedule 04.02.2017
comment
У меня есть, но в нем нет нужного мне функционала.   -  person Keanu73    schedule 04.02.2017


Ответы (1)


Если вы не хотите анализировать всю спецификацию ISO 8601, попробуйте следующий код:

s="PT3M33S"
t=s:gsub("^.-(%d+)M(%d+)S","%1:%2")
print(t)

Он использует сопоставление с образцом Lua. Шаблон гласит: пропустить все до набора цифр, за которым следует M, а затем найти ряд цифр, за которым следует S. Захватите обе серии цифр и используйте их в шаблоне замены.

Если вы хотите извлечь оба числа, используйте это:

s="PT3M33S"
M,S=s:match("^.-(%d+)M(%d+)S")
print(M,S)
person lhf    schedule 03.02.2017
comment
Если вы хотите обрабатывать многочасовые видео и другие крайние случаи (может быть, видео ‹ 1 мин просто сгенерирует, например, PT48S?), вы можете попробовать сопоставить (%d*)H, (%d*)M, (%d* )S отдельно и получит либо пустую строку (отсутствующее поле/неявный ноль), либо строку цифр. tonumber( v ) or 0 даст вам цифры. local N=tonumber ; H,M,S=N(s:match"(%d*)H") or 0, N(s:match"(%d*)M") or 0, N(s:match"(%d*)S") or 0 (Обратите внимание, что это предполагает, что вы знаете, что ввод действителен — в противном случае это мусор на входе, мусор на выходе.) - person nobody; 04.02.2017