接受任何字母任何语言、符号或数字的任何汇编的正则表达式
Regex that accepts any compilation of any letters any languages,symbols or numbers
我正在开发一个正则表达式,它可以从字幕文件中获取文本,该文件可以是任何语言,有时包含 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
";
使用 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
是否可以更新正则表达式以匹配文本槽中找到的数字,但不是字幕时间数字的一部分。
你的字符 class 有一个错误:*
和 ,
之间的 -
表示范围而不是字符 -
。可以转义,也可以放在字符class.
的beginning/end处
解决这个问题并添加 \p{N}
给我们 [\p{P}\p{L}\p{P}*,;'"\s\p{N}-]+
这几乎是完美的但失败了,因为它不包括 >
.
[\p{P}\p{L}\p{P}*,;'"\s\p{N}>-]+
就完美了,见demo
.srt
specification 太简单了,你不应该写一个大的,可能会损坏的 RegExp 来解析它。
从 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."]]
我正在开发一个正则表达式,它可以从字幕文件中获取文本,该文件可以是任何语言,有时包含 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
";
使用 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
是否可以更新正则表达式以匹配文本槽中找到的数字,但不是字幕时间数字的一部分。
你的字符 class 有一个错误:*
和 ,
之间的 -
表示范围而不是字符 -
。可以转义,也可以放在字符class.
解决这个问题并添加 \p{N}
给我们 [\p{P}\p{L}\p{P}*,;'"\s\p{N}-]+
这几乎是完美的但失败了,因为它不包括 >
.
[\p{P}\p{L}\p{P}*,;'"\s\p{N}>-]+
就完美了,见demo
.srt
specification 太简单了,你不应该写一个大的,可能会损坏的 RegExp 来解析它。
从 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."]]