【问题标题】:How to parse .srt file if it contains multiple lines of subtitle text using Scanner in swift?如果.srt文件包含多行字幕文本,如何在swift中使用Scanner解析它?
【发布时间】:2018-11-10 00:04:48
【问题描述】:

我的.srt文件内容如下:

1<br>
00:00:00,000 --> 00:00:01,000 <br>
This is the first line: <br>
and it has a secondary line,<br>
it may have more lines

2<br>
00:00:01,000 --> 00:00:02,000<br>
This is the second line<br>
it may have more lines<br>

3<br>
00:00:02,000 --> 00:00:03,000<br>
This is the last line<br>
and it has a secondary line too,<br>
it may have more lines

我正在使用扫描仪,但它没有得到正确解析,如下所示:

var indexString: NSString?
scanner.scanUpToCharacters(from: CharacterSet.newlines, into: &indexString)
var startTimeString: NSString?
scanner.scanUpTo(" --> ", into: &startTimeString)
scanner.scanString("-->", into: nil)



var endTimeString: NSString?
scanner.scanUpToCharacters(from: CharacterSet.newlines, into: &endTimeString)



var textString: NSString?
scanner.scanUpTo("\n", into: &textString)
if textString != nil {
    textString = (textString?.replacingOccurrences(of: "\r\n", with: " "))! as NSString
    textString = (textString?.trimmingCharacters(in: CharacterSet.whitespaces))! as NSString
}

【问题讨论】:

    标签: ios swift nsscanner


    【解决方案1】:

    考虑使用简单的正则表达式:

    let pattern = "(?<index>^\\d+$)\\n^(?<startTime>\\d\\d:[0-5]\\d:[0-5]\\d,\\d{1,3}) --> (?<endTime>\\d\\d:[0-5]\\d:[0-5]\\d,\\d{1,3})$\\n(?<text>(?:^.+$\\n?)+)"  
    
    let regex = try NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)  
    let matches = regex.matches(in: srt, range: NSRange(..<srt.endIndex, in: srt))
    let firstTextRange = matches[0].range(withName: "text")
    let firstText = Range(firstTextRange, in: srt).flatMap { range in String(srt[range]) }
    

    我建议缓存正则表达式。

    【讨论】:

    • 谢谢斯蒂莫罗。如果我没记错 entryPattern 是模式(指定正则表达式)而 srt 是 srt 文件内容?
    • @RamaChandraMahapatra 是的,完全正确。固定
    • 是的,已修复,但 'range(withName:)' 仅适用于 iOS 11.0 或更高版本。什么可以代替低版本?当 srt 文件内容中有特殊字符时也会出现问题。 :)
    • @RamaChandraMahapatra 将 range(at:) 分别用于 1、2、3 和 4。特殊字符有什么问题?
    • 好吧,让我试试,当特殊字符(如 " )在 srt 内容中时,模式无法匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多