使用regex C#解析字幕文件

时间:2009-11-19 17:19:20

标签: regex subtitle

我需要找到数字,进出时间码点和文本的所有行。

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,\d{3}) --> (?<EndTime>(\d\d:){2}\d\d,\d{3})\r\n(?<Sub>.+)(?=\r\n\r\n\d+|$)

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

如果我是你,我会退出基于正则表达式的实现,并查看状态机,逐行浏览文件。您的格式看起来很简单,可以处理20-40行容易理解的代码,但对于合理的正则表达式来说太复杂了。

答案 1 :(得分:3)

我认为正则表达式存在两个问题。第一个是.中靠近末尾的(?<Sub>.+)与新行不匹配。所以你可以将其修改为:

(?<Sub>(.|[\r\n])+?)

或者您可以指定RegexOptions.Singleline作为正则表达式的选项。该选项唯一能做的就是使点匹配换行符。

第二个问题是.+匹配尽可能多的行。你可以像以下一样非贪婪:

(?<Sub>(.|[\r\n])+?(?=\r\n\r\n|$))

匹配以空行或字符串结尾结尾的文本数量最少。

答案 2 :(得分:0)

我个人将这些行拆分成一个数组并循环遍历检查每一行的数组,只是对StartTime-&gt; EndTime行进行正则表达式匹配,然后你可以使用一些相当简单的逻辑从前一行中获取Order ,并从下面的行中获取文本(通过向前搜索找到下一个StartTime-&gt; Endtime并回溯两行)。

我认为这样可以解决问题,以便你没有正则表达式来尝试这一切。

答案 3 :(得分:0)

我使用以下正则表达式来解析.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

答案 4 :(得分:0)

我在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”是读入内存的整个字幕文件。