Javascript 与整个文件匹配的正则表达式

Javascript 与整个文件匹配的正则表达式,javascript,node.js,json,regex,ecmascript-6,Javascript,Node.js,Json,Regex,Ecmascript 6,我有一个很大的SRT(subtitle)文件,我正试图将其转换为JSON,但我的正则表达式似乎无法正常工作 我的表情是: ^(\d+)\r?\n(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\s*\-\-\>\s*(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\r?\n([\s\S]*)(\r?\n)*$ 这是我的srt文件的一个示例,每个副标题都遵循相同的方案 1 00:00:11,636 --> 00:00:13,

我有一个很大的SRT(subtitle)文件,我正试图将其转换为JSON,但我的正则表达式似乎无法正常工作

我的表情是:

^(\d+)\r?\n(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\s*\-\-\>\s*(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\r?\n([\s\S]*)(\r?\n)*$
这是我的srt文件的一个示例,每个副标题都遵循相同的方案

1
00:00:11,636 --> 00:00:13,221
Josh communicated but

2
00:00:13,221 --> 00:00:16,850
it's also the belief that
we never knew the severity
我的javascript文件

const fs = require('fs');
function parse(content, options) {
    var captions = [];
    var parts = content.split(/\r?\n\s+\r?\n/g);
    for (var i = 0; i < parts.length; i++) {
        var regex = /^(\d+)\r?\n(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\s*\-\-\>\s*(\d{1,2}:\d{1,2}:\d{1,2}([.,]\d{1,3})?)\r?\n([\s\S]*)(\r?\n)*$/gi;
        var match = regex.exec(parts[i]);
        if (match) {
            var caption = {};
            var eol = "\n";
            caption.id = parseInt(match[1]);
            caption.start = match[2];
            caption.end = match[4];
            var lines = match[6].split('/\r?\n/');
            caption.content = lines.join(eol);
            captions.push(caption);
            continue;
        }
    }
    return captions;
};

var content = fs.readFileSync('./English-SRT-CC.srt', 'utf8');
var captions = parse(content);
var json = JSON.stringify(captions, " ", 2);
console.log(json);
fs.writeFile("output.json", json, 'utf8', function (err) {
    if (err) {
        return console.log(err);
    }

    console.log("JSON file has been saved.");
});
我想要的产量

{
    "id": 1,
    "start": "00:00:11,636",
    "end": "00:00:13,221",
    "content": "Josh communicated but"
},
{
    "id": 2,
    "start": "00:00:13,221",
    "end": "00:00:16,850",
    "content": "it's also the belief that\n we never knew the severity"
}
谢谢


编辑:

使用此正则表达式匹配文本:

/\d+\n[0-9\:\,\-\>\s]{29}\n(.+|(\n[^\n]))+/g
我将把它分成几个部分:

第1部分:
\d+\n

此部分匹配后跟一个换行符的任何数字

第2部分:
[0-9\:\,\-\>\s]{29}\n

此部分匹配包含的字符,精确长度为29,这是固定格式,例如,
00:00:11636-->00:00:13221
,然后后跟一个换行字符

第三部分:
(.+|(\n[^\n]))+

现在这部分很重要。我将把它分成几个部分:

  • +
    将匹配除换行符以外的任何字符
  • (\n[^\n])
    只匹配一个换行符,而后面不跟另一个换行符。这对于使多行字幕匹配成为可能非常重要。否则,您将无法匹配多行字幕(因为文件结构,而不是因为regex限制)
用括号
(…)+
将它们包装起来,使其与多行匹配。这就是如何匹配多行字幕的方法

第4部分:
g

使用此选项可匹配多个匹配项

工作代码

根据这个regexp,我还使用了另一种方法将其解析为所需的输出,这比当前方法简单得多,也不太复杂

您可以看到如何利用它:

const text=`
1.
00:00:11,636 --> 00:00:13,221
乔希沟通了,但是
2.
00:00:13,221 --> 00:00:16,850
这也是一种信念
我们从来不知道事情的严重性
`;
常量regex=/\d+\n+[0-9\:\,\-\>\s]{29}\n(+.+\124;(\ n[^\n]))+/g;
const rawResult=text.match(regex);
console.log(rawResult);
const parsedResult=rawResult.map(块=>{
const[id,time,…line]=块分割(/\n/g);
const[start,end]=时间分割(/\s\-\->\s/);
const content=lines.join('\n');
返回{id,start,end,content};
});

console.log(parsedResult)使用正则表达式解析JSON是一个全面的坏主意。@TimBiegeleisen我正在使用正则表达式解析本地文件中的文本,然后将其解析为JSON。
/\d+\n[0-9\:\,\-\>\s]{29}\n(.+|(\n[^\n]))+/g