1

我需要使用正则表达式将 SRT 文件的数据作为数组获取。

到目前为止,这是我的代码:

Java脚本:

function readSrt() {
  var srtUrl = 'assets/media/subtitles.srt';

  $.get(srtUrl, function(data) {
    console.log("SRT:", data); // it reads ok

    var regexp = /(.*)\n(.*),\d\d\d --> (.*)\n(.*)/g; // this regex doesn't work

    console.log("SUBS:", data.match(regexp)); // outputs null
  });
}

字幕.srt:

0
00:00:00,000 --> 00:00:01,000
Instructor…All right, let's start off

1
00:00:01,000 --> 00:00:04,000
here. We were, I think, wrapping up kind

...

14
00:00:40,000 --> 00:00:42,000
mound, basically.

15
00:00:42,000 --> 00:00:44,000
If you go to Colossae today, none of it

...

需要获得:

1.  0
2.  00:00:00
3.  00:00:01,000
4.  Instructor…All right, let's start off

在regex101.com中进行了几次尝试,但似乎只适用于 PHP 而不是 javascript。

我做错了什么,我该如何解决?

4

3 回答 3

1

您的正则表达式中可能出错的一件事.*是贪婪。它将在第一个标题中开始匹配,并且仅在最后一个标题处结束匹配。尝试用它的惰性替代品替换它,以尽可能少地匹配。

/(.*?)\n(.*?),\d\d\d --> (.*?)\n(.*?)\n/
于 2014-08-22T17:18:49.180 回答
0

你很近。正则表达式的主要问题是周围的部分(.*),\d\d\d,它不起作用,因为(.*)它将匹配整行文本,使正则表达式的其余部分无效。

固定的正则表达式是:

/(.*)\n([^,]+),[\d]{3} --> (.*)\n(.*)(?:\n*)/g
于 2014-08-22T17:53:12.717 回答
0

您还依靠.通配符来捕获\n(并且可能是\r),但它不会这样做(有关该信息,请参见http://www.regular-expressions.info/javascript.html,“确实没有/s 修饰符”位)。使用显式组来获得更大的胜利:使用[^\n]+\n“任何内容,然后换行”,[^,]+,用于“逗号之前的任何内容”等。

于 2014-08-22T17:19:08.093 回答