1

我需要找到数字、输入和输出时间码点以及文本的所有行。

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+|$)

任何帮助将非常感激。

4

5 回答 5

3

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

于 2009-11-19T17:27:01.720 回答
3

我认为正则表达式有两个问题。第一个是.接近结尾的 in(?<Sub>.+)不匹配换行符。因此,您可以将其修改为:

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

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

第二个问题是.+匹配尽可能多的行。你可以让它不贪婪,比如:

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

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

于 2009-11-19T17:27:18.550 回答
0

我会亲自将这些行拆分为一个数组并循环检查每一行,只需对 StartTime->EndTime 行进行正则表达式匹配,然后您可以使用一些相当简单的逻辑从前一行中获取 Order,然后获取以下行中的文本(通过向前搜索以找到下一个 StartTime->Endtime 并回溯两行)。

我认为这种方式可以稍微解决问题,这样您就没有正则表达式来尝试完成所有操作。

于 2009-11-19T17:27:54.837 回答
0

我正在使用以下正则表达式来解析 .srt 文件:

@"(?<number>\d+)\r\n(?<start>\S+)\s-->\s(?<end>\S+)\r\n(?<text>(.|[\r\n])+?)\r\n\r\n"

正则表达式语言 - 快速参考

于 2012-08-30T20:03:54.393 回答
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”是读入内存的整个字幕文件。

于 2014-07-19T17:16:40.547 回答