Тема: AHK: Продвинутый RegExReplace
Возникла тут задача синхронизировать по времени файл субтитров с видео.
Файл субтитров .srt оказался текстовым и содержал временные метки в формате hh:mm:ss и привязанные к ним реплики.
Для синхронизации нужно сдвинуть все метки на х минут у секунд.
В качестве побочного эффекта получилась функция, для массовой замены подходящих под RegExp выражений, на результат обработки этих выражений произвольной функцией.
filePath := "S:\kino\The Intern (2015).srt"
shift:=-62 ; sec
FileRead text, %filePath%
modText := RegExReplFunc(text, "\d\d:\d\d:\d\d", "timeShift", [shift])
FileMove %filePath%, %filePath%_orig
FileAppend %modText%, %filePath%
Return
RegExReplFunc(haystack, NeedleRegEx, f, p) {
pos:=1
NeedleRegEx:= "O)" NeedleRegEx
while RegExMatch(haystack, NeedleRegEx, Match, pos) {
matchWord:=Match.Value(0)
postWord := %f%(matchWord, p*)
if (postWord != false)
haystack := RegExReplace(haystack, matchWord, postWord, byRefNumberOfRepl, limit:=1, pos)
pos := Match.Pos(0) + Match.Len(0)
}
Return haystack
}
timeShift(time, shift) {
; 23:30:55 + 100 = 23:32:35
RegExMatch(time, "O)^\d\d", Match)
hh := Match.Value(0)
RegExMatch(time, "O)(?<=:)\d\d(?=:)", Match)
mm := Match.Value(0)
RegExMatch(time, "O)\d\d$", Match)
ss := Match.Value(0)
t = 19990101 ; дата от балды
t += hh*3600 + mm*60 + ss, Seconds
t += %shift%, Seconds
FormatTime t, %t%, HH:mm:ss
return t
}
Offtop: Конечно, должны существовать специально заточенные под работу с сабами программы, но было интересно решение в общем случае.

