为了同时学习一些 SwiftUI 和 Regex 的知识,我认为将 VTT 文件转换为 SRT 文件是一项非常简单的任务。在此转换中,包含句点的时间戳将转换为带有逗号的相同时间戳。
我以为使用捕获时间戳的正则表达式可以很好地处理这个问题。我编写了代码,当针对一些记录样本进行测试时,一切似乎都运行良好。但是,当我将整个 VTT 文件转储为字符串并尝试时,该函数就会挂起。我认为问题在于替换的数量。
一部典型的好莱坞电影的 VTT 文件大约有 1,500 条记录,每条记录都有时间戳,需要 2 次翻译。时间戳如下所示:00:00:48.757 --> 00:00:52.970
& 唯一需要做的就是将句号变成逗号,如下所示:00:00:48,757 --> 00:00:52,970
。
我不能只进行全局替换,因为其他句号会变成逗号,而我只想对时间戳进行替换。以下代码可以正确完成翻译,但对于大文件会挂起:
func VTT2SRT() {
var vtt$ = vttText // preserve vttText from views
let targetPattern = /(?<timeStamp>\d\d:\d\d:\d\d)./
let matchArray = vtt$.matches(of: targetPattern)
for s$ in matchArray {
vtt$ = vtt$.replacing(s$.0, with: s$.timeStamp + ",")
}
[other stuff that works just fine]
srtText = srt$ // pass it back to views
}
我不明白为什么这会挂起或需要这么长时间。有人能给我指出正确的方向或建议另一种方法吗?注意:我正在 macOS 14.6.1 (23G93) 下尝试使用 Xcode 版本 15.4 (15F31d)