使用正则表达式 C# 解析字幕文件
Posted
技术标签:
【中文标题】使用正则表达式 C# 解析字幕文件【英文标题】:Parse subtitle file using regex C# 【发布时间】:2009-11-19 17:19:19 【问题描述】:我需要找到数字、输入和输出时间码点以及文本的所有行。
9
00:09:48,347 --> 00:09:52,818
- Let's see... what else she's got?
- Yea... ha, ha.
10
00:09:56,108 --> 00:09:58,788
What you got down there, missy?
11
00:09:58,830 --> 00:10:00,811
I wouldn't do that!
12
00:10:03,566 --> 00:10:07,047
-Shit, that's not enough!
-Pull her back!
我目前正在使用这种模式,但它忘记了所有两行文本
(?<Order>\d+)\r\n(?<StartTime>(\d\d:)2\d\d,\d3) --> (?<EndTime>(\d\d:)2\d\d,\d3)\r\n(?<Sub>.+)(?=\r\n\r\n\d+|$)
任何帮助将不胜感激。
【问题讨论】:
您是否让点捕获换行符?使用 RegexOptions.Singleline。否则 (?.+) 不会匹配换行符。 【参考方案1】:我认为正则表达式存在两个问题。首先是(?<Sub>.+)
末尾附近的.
与换行符不匹配。因此,您可以将其修改为:
(?<Sub>(.|[\r\n])+?)
或者您可以指定RegexOptions.Singleline
作为正则表达式的选项。该选项唯一要做的就是使点匹配换行符。
第二个问题是.+
匹配尽可能多的行。你可以让它不贪心,比如:
(?<Sub>(.|[\r\n])+?(?=\r\n\r\n|$))
这匹配以空行或字符串结尾的最少文本。
【讨论】:
【参考方案2】:如果我是你,我会退出基于正则表达式的实现,并查看状态机,逐行浏览文件。您的格式看起来很简单,可以用 20-40 行易于理解的代码来处理,但对于合理的正则表达式来说太复杂了。
【讨论】:
【参考方案3】:我会亲自将这些行拆分为一个数组,并在数组中循环检查每一行,只需对 StartTime->EndTime 行进行正则表达式匹配,然后您可以使用一些相当简单的逻辑从前一行中获取 Order,并从后面的行中获取文本(通过向前搜索以找到下一个 StartTime->Endtime 并回溯两行)。
我认为这种方式可以稍微解决问题,这样您就不必使用正则表达式来解决所有问题。
【讨论】:
【参考方案4】:我正在使用以下正则表达式来解析 .srt 文件:
@"(?<number>\d+)\r\n(?<start>\S+)\s-->\s(?<end>\S+)\r\n(?<text>(.|[\r\n])+?)\r\n\r\n"
Regular Expression Language - Quick Reference
【讨论】:
【参考方案5】:我在我的 Ruby 解析器中使用了这个正则表达式:
slines.scan(/(^[0-9]+)\r?\n(.*? --> .*?)\r?\n(.*?)(?=^[0-9]+\r?\n|\s+\Z)/im).map|z| [z[0],[z[1],z[2].strip]]
其中“slines”是读入内存的整个字幕文件。
【讨论】:
以上是关于使用正则表达式 C# 解析字幕文件的主要内容,如果未能解决你的问题,请参考以下文章