【发布时间】:2011-10-30 05:34:52
【问题描述】:
我编写了这个正则表达式来解析 srt 文件中的条目。
(?s)^\d++\s{1,2}(.{12}) --> (.{12})\s{1,2}(.+)\r?$
我不知道这是否重要,但这是使用 Scala 编程语言完成的(Java 引擎,但是是文字字符串,因此我不必加倍反斜杠)。
之所以使用s{1,2},是因为有些文件只有换行符\n,而其他文件则有换行符和回车符\n\r
第一个(?s)启用DOTALL模式,这样第三个捕获组也可以匹配换行符。
我的程序基本上打破了使用\n\r?\n 作为分隔符的 srt 文件,并使用 Scala 良好的模式匹配功能来读取每个条目以进行进一步处理:
val EntryRegex = """(?s)^\d++\s{1,2}(.{12}) --> (.{12})\s{1,2}(.+)\r?$""".r
def apply(string: String): Entry = string match {
case EntryRegex(start, end, text) => Entry(0, timeFormat.parse(start),
timeFormat.parse(end), text);
}
示例条目:
一行:
1073
01:46:43,024 --> 01:46:45,015
I am your father.
两行:
160
00:20:16,400 --> 00:20:19,312
<i>Help me, Obi-Wan Kenobi.
You're my only hope.</i>
问题是,分析器告诉我,这种解析方法是迄今为止我的应用程序中最耗时的操作(它会进行密集的时间数学运算,甚至可以比读取和解析文件快几倍)条目)。
那么任何正则表达式向导都可以帮助我优化它吗?或者也许我应该牺牲正则表达式/模式匹配的简洁性并尝试一种老式的java.util.Scanner 方法?
干杯,
【问题讨论】:
标签: java regex optimization scala