Javascript 与整个文件匹配的正则表达式
我有一个很大的SRT(subtitle)文件,我正试图将其转换为JSON,但我的正则表达式似乎无法正常工作 我的表情是: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,
^(\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]))+
现在这部分很重要。我将把它分成几个部分:
将匹配除换行符以外的任何字符+
只匹配一个换行符,而后面不跟另一个换行符。这对于使多行字幕匹配成为可能非常重要。否则,您将无法匹配多行字幕(因为文件结构,而不是因为regex限制)(\n[^\n])
(…)+
将它们包装起来,使其与多行匹配。这就是如何匹配多行字幕的方法
第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