.net - 使用正则表达式从 webvtt 中提取

标签 .net regex webvtt

我正在尝试构建一个在 .Net 环境中使用的正则表达式,它允许我从 webvtt 文件中提取信息。

我想从可能是字幕或其他内容的下一行中提取时间码信息和相应信息。
我遇到的问题是下一行的信息有时是一行,有时跨越多行,例如:

00:00:02.736 --> 00:00:06.072 line:79.33% position:10.00% align:start 
   AND YOUR GRACE?

00:00:06.072 --> 00:00:08.875 line:74.00% position:10.00% align:start 
  WHAT WILL YOU DO
     ABOUT THAT?

而且我需要确保我得到了所有这些,而不会无意中进入下一组的开始。

我试过这个:
\n(\d{2}:\d{2}:\d{2}.\d{3})(.|\n)*(?<!\d{2}:\d{2}:\d{2}.\d{3})

这个想法是它获取第一个时间码和之后的所有内容,但在第一个时间码的下一次出现时再次停止,但它捕获整个文件。

我也试过:
(?<!WEBVTT)(\d{2}:\d{2}:\d{2}.\d{3}).*?(\d{2}:\d{2}:\d{2}.\d{3}).*\n([^\n]+\n)*[^\n]+

我意识到负前瞻在开始时是多余的。在这里,我试图将时间码放入单独的组中,忽略该行的其余部分,然后从新行开始捕获所有内容,但这是跳过字幕文本而不是跨越多行。

我似乎遇到的问题是我要么捕获太多行,要么不够。

有没有办法告诉正则表达式匹配某些内容(例如第一个时间码)及其之后的所有内容,然后在命中第一个匹配项时重新开始?

我确信这一定是可能的,但我是使用正则表达式的新手,所以我发现这很困难。我不介意是否必须将其分解为多个操作才能获得所需的结果。

所以我想要得到的是:

第一组:
00:00:02.736

或者
00:00:02.736 --> 00:00:06.072

第二(或第三,取决于上述):
AND YOUR GRACE?

然后:
00:00:06.072 --> 00:00:08.875

其次是:
WHAT WILL YOU DO
 ABOUT THAT?

等等

最佳答案

看来你可以用

(?m)^(\d{2}:\d{2}:\d{2}\.\d+) +--> +(\d{2}:\d{2}:\d{2}\.\d+).*[\r\n]+\s*(?s)((?:(?!\r?\n\r?\n).)*)

regex demo

详情
  • (?m) - 多行模式
  • ^ - 一行的开始(由于 (?m) )
  • (\d{2}:\d{2}:\d{2}\.\d+) - 第 1 组:时间戳模式
  • +--> + - 1+ 个空格,--> , 1+ 个空格
  • (\d{2}:\d{2}:\d{2}\.\d+) - 第 2 组:时间戳模式
  • .*[\r\n]+\s* - 该行的其余部分 ( .* )、1+ 个换行符 ( [\r\n]+ ) 然后是 0+ 个空格 ( \s* )
  • (?s) - 从现在开始启用 DOTALL(. 匹配换行符)
  • ((?:(?!\r?\n\r?\n).)*) - 第 3 组:任何未开始双换行符序列的字符,0+ 次。

  • enter image description here

    关于.net - 使用正则表达式从 webvtt 中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630349/

    相关文章:

    regex - 为什么是 (?i :abc) an unrecognized rule in flex

    HTML5本地播放带字幕的MP4视频

    html - HTML5视频是否可以将嵌入在mp4文件中的字幕作为轨道播放?

    c# - 如何在当前上下文中访问 WCF 服务实例?

    c# - WCF 到 WCF 通过 MSMQ 请求和响应

    C# 2010 未加载 delphi DLL

    javascript - 字符串与javascript中的排序规则比较

    c# - 如何设置这个Stub对象的返回值?

    python - 仅当没有给定前缀和任意数量的空格时才匹配单词

    javascript - 默认接收器上的 Chromecast WebVTT 字幕