【问题标题】:Regex that accepts any compilation of any letters any languages,symbols or numbers接受任何字母、任何语言、符号或数字的任何编译的正则表达式
【发布时间】:2016-12-04 10:52:31
【问题描述】:

我正在开发一个正则表达式,它可以从字幕文件中获取文本,可能是任何语言,有时包含 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

这是一种更新正则表达式以匹配在文本槽中找到的数字但不是字幕计时数字的一部分的方法。

【问题讨论】:

  • 是的,应该够了。你测试了吗?
  • 是的,但我不太可能用结果更新问题
  • @ThomasAyoub 添加\\p{N}后,我已经用状态更新了问题

标签: java regex subtitle


【解决方案1】:

.srt specification 太简单了,你不应该写一个大的,可能坏掉的正则表达式来解析它。

从 Java 8 开始,您可以使用 \R 匹配任何换行符。

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

对于每个字幕块,围绕"\\R" 拆分,最多包含 3 个元素。 你会得到一个String[]

  • 身份证
  • 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."]]

【讨论】:

  • 优秀而快速的方式非常感谢,这比复杂的正则表达式要好得多
【解决方案2】:

你的字符类有一个错误:*, 之间的- 表示一个范围,而不是字符-。您可以对其进行转义或将其放在字符类的开头/结尾。

修复此问题并添加\p{N} 为我们提供了[\p{P}\p{L}\p{P}*,;'"\s\p{N}-]+,这几乎是完美的,但失败了,因为它不包含>

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

【讨论】:

  • 它获取数字,但也获取整个文本如何使其仅适用于每个插槽文本
  • 只想获取文本:“你可以看到他不再是 1 岁,他现在已经 12 岁了。”
  • 顺便说一句,我有计时正则表达式只需要有效的文本部分
  • 抱歉仍然获取整个文本,抱歉我不得不提早提到正则表达式应用于包含所有字幕文件内容的字符串
  • @YouYou,请用相关信息编辑您的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多