2016-12-04 86 views
2

我正在开发一个正则表达式,可以获取从字幕文件中的文本可以是任何语言的任何编译有时包含Unicode字符正则表达式接受任何字母任何语言,符号或数字

String str= 
    "1 
    00:00:25,690 --> 00:00:44,410 
    As you can see he is no longer 1 year old, he is 12 years old now. 

    2 
    00:00:44,410 --> 00:00:58,120 
    He helps with the baby girl 
"; 

撷取eaching插槽采用ragex:

((^1\n|(\\n\\d+\n))(\\d{2}:\\d{2}:\\d{2},\\d{3}.*\\d{2}:\\d{2}:\\d{2},\\d{3}))[\\p{P}\\p{L}\\p{P}*-,;'\"\\s]+ 

但最近发现,字幕文本插槽,可以包含数字,所以如何覆盖具有任何字符任何语言的任何Unicode字符和之间的任意数字的一切可能性。

尝试添加\p{N}

但失败。它现在包括时间和字幕顺序以及: 有时是这样的:blah blah blah.400:00:44,410

是否更新正则表达式以匹配在文本槽中找到的数字,但不是字幕定时数的一部分。

+0

是的,它应该是足够的。你测试过了吗? –

+0

是的,但不太可能我会更新问题的结果 – YouYou

+0

@ThomasAyoub我已经更新了问题的状态后添加''\\ p {N}'' – YouYou

回答

2

.srtspecification就是这么简单,你不应该写一个大的,有可能打破正则表达式解析它。

从Java 8中,你可以使用\R匹配任何换行符。

因此,将您的.srt文件与"\\R\\R"分开以获得字幕块。

对于每个字幕块,分割周围"\\R"最多3个元素。 你得到一个String[]有:

  • ID
  • T1 - 在任何语言> T2
  • 文本,可以用换行和数字内。

完成!

=> [["1", "00:00:23,480 --> 00:00:27,920", "AM RANDE DER NACHT"], 
["2", "00:02:22,570 --> 00:02:24,060", "- Salü.\r\n- Monsieur."], 
["3", "00:02:25,300 --> 00:02:26,890", "- Panne?\r\n- Hm."], 
["4", "00:02:29,840 --> 00:02:31,830", "Und wieviel brauchst du?"], 
["5", "00:02:32,340 --> 00:02:34,000", "Von was, Monsieur?"], 
["6", "00:02:34,120 --> 00:02:35,140", "Na ja, Sprit."], 
["7", "00:02:36,210 --> 00:02:38,230", "Es äh... es liegt nicht am Sprit."], 
["8", "00:02:38,490 --> 00:02:40,710", "Es ist, glaub ich, die Kerze."], 
["9", "00:02:42,220 --> 00:02:43,980", "Was für 'ne Kerze brauchst du?"], 
["10", "00:02:45,390 --> 00:02:47,800", "Äh, 'ne Kerze eben. Für 'n Moped."]] 
+0

非常好,快捷的方式非常感谢这比复杂的正则表达式好多了 – YouYou

1

您的字符类一个错误:*,之间的-指范围,而不是焦炭-。您可以将其转义或放在字符类的开始/结尾处。

修复这一点,并添加\p{N}给我们[\p{P}\p{L}\p{P}*,;'"\s\p{N}-]+这几乎是完美的,但因为它不包括>失败。

[\p{P}\p{L}\p{P}*,;'"\s\p{N}>-]+将是完美的,看到demo

+0

它获取数字,但作为整个文本如何使这项工作的每个插槽仅文字 – YouYou

+0

只想取文:“正如你所看到的,他不再是1岁,他现在已经12岁了。” – YouYou

+0

顺便说一句我有时间正则表达式只需要有效的文本只有部分 – YouYou

相关问题