Я написал это регулярное выражение для разбора записей из файлов SRT.
(?s)^\d++\s{1,2}(.{12}) --> (.{12})\s{1,2}(.+)\r?$
Я не знаю, имеет ли это значение, но это делается с использованием языка программирования Scala (Java Engine, но буквальных строк, чтобы мне не приходилось удваивать обратную косую черту).
s{1,2}
используется, потому что некоторые файлы будут иметь только разрывы строк \n
, а другие будут иметь разрывы строк и возврат каретки \n\r
Первый (?s)
включает режим DOTALL
, так что третья группа захвата может также соответствовать переносам строк.
Моя программа в основном разбивает файл srt, используя \n\r?\n
в качестве разделителя, и использует функцию сопоставления с образцом 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
?
Приветствия