2016-12-04 90 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

相關問題