3

我正在尝试构建一个正则表达式以在 .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?

ETC

4

1 回答 1

2

看来你可以使用

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

查看正则表达式演示

细节

  • (?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 次以上。

在此处输入图像描述

于 2017-08-11T10:40:06.680 回答