AutoHotKey Регулярное выражение
Я пишу скрипт для облегчения генерации субтитров (srt). У меня есть горячая клавиша, чтобы получить метку времени у игрока и вставить ее. Однако игрок (Express Scribe), к сожалению, показывает метки времени в этом формате: 00: 00: 00.00, а SRT использует 00:00:00,00.
Я хочу сделать две вещи.
- Изменить '.' к ','
- Сохраните метку времени как переменную, а затем немного увеличьте последние миллисекунды. то есть. 00: 00: 00,00 становится 00:00:00,50
Любая помощь с этим будет принята с благодарностью.
1 ответ
Решение
Действительно хитрая вещь в том, что временная метка05:59:59.60
не может быть легко увеличено на 50.
Результат должен быть06:00:00,10
потому что центсекунда не может превышать 99, а секунда не может превышать 59 (точно так же, как минута не может).
Так что нам нужно использовать немного раздражающей математики здесь:
playerFormat := "01:10:50.70"
;extract hour, minute, second and centisecond using regex
RegExMatch(playerFormat,"O)(?P<hour>\d+):(?P<minute>\d+):(?P<second>\d+)\.(?P<centisecond>\d+)",matches)
;convert the strings to numbers by removing the leading zeros
hour := LTrim(matches.hour,"0")
minute := LTrim(matches.minute,"0")
second := LTrim(matches.second,"0")
centisecond := LTrim(matches.centisecond,"0")
;translate the total time into centiseconds
centiSecondsTotal := centisecond + second*100 + minute*100*60 + hour*100*60*60
;add 50 centiseconds (=0.5 seconds) to it
centiSecondsTotal += 50
;useing some math to translate the centisecond number that we just added the 50 to into hours, minutes, seconds and remaining centiseconds again
hour := Floor(centiSecondsTotal / (60*60*100))
centiSecondsTotal -= hour*60*60*100
minute := Floor(centiSecondsTotal/(60*100))
centiSecondsTotal -= minute*100*60
second := Floor(centiSecondsTotal/(100))
centiSecondsTotal -= second*100
centisecond := centiSecondsTotal
;add leading zeros for all numbers that only have 1 now
hour := StrLen(hour)=1 ? "0" hour : hour
minute := StrLen(minute)=1 ? "0" minute : minute
second := StrLen(second)=1 ? "0" second : second
centisecond := StrLen(centisecond)=1 ? "0" centisecond : centisecond
;create the new timestamp string
newFormat := hour ":" minute ":" second "," centisecond
MsgBox, %newFormat% ;Output is 01:10:51,20