提前为我的糟糕代码道歉/试图解释我想要达到的目的…
我想采取各种转录,与时间戳,并将其转换为创建字幕的一致格式。这些记录不是来自相同的来源,文档的结构和时间戳各不相同,有时甚至在同一文档中也是如此。
时间戳格式为[HH:MM:SS]。FF](我可以处理的变化),它包含在文本中。时间戳有时表示一个结束点(通常它们只是一个开始点)。
格式是
[Timestamp1]Some text with various line breaks and weird characters.
[Timestamp2]More text where this transcript continues but ends with some silence after this
[Timestamp3]
[Timestamp4]The next sentence begins and ends at the last
[Timestamp5]
在JavaScript中最好的编码方法是什么?我用绳子绕着房子走了一圈。split和re.matchAll但没有一个我想出的正则表达式模式可以处理连续的2个时间戳。
我认为理想情况下,我会有正则表达式模式,获得时间戳,然后存储一个对象数组,有一个开始和结束时间戳(结束是下一个开始,如果结束不存在)和相关的文本。
在上面的例子中,我输入
Start: Timestamp1 End: Timestamp2 Text: "Some text..."
Start: Timestamp2 End: Timestamp3 Text: "More text..."
Start: Timestamp4 End: Timestamp5 Text: "The next..."
这是我最近的一次尝试…
function test(){
str =
`[09:35:10.00]
1. Lorem ipsum...
[09:35:13.11]
[09:35:15.14]
2. sed do eiusmod...
[09:35:39.20]
3. anim id est laborum...
[09:35:43.17]`
var re = /(?<tc1>[?(?:[0-1][0-9]|2[0-3]|[0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])(?:.(?:[0-9]{2,3})?]?))s*(.*)s*(?<tc2>[?(?:[0-1][0-9]|2[0-3]|[0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])(?:.(?:[0-9]{2,3})?]?))?.*/gm;
const matches = str.matchAll(re);
for (const match of matches) {
console.log(`Start TC:n${match[1]}nText:n${match[2]}nTC2:n${match[3]}`);
}
}
不幸的是,它不能满足变化。
谢谢你给我指路。
图案需要由3部分组成:
- 匹配并捕获时间戳:
[
,后跟数字、冒号和句点:[d{2}:d{2}:d{2}.d{2}]
- 匹配并捕获除时间戳:
(?:(?!TIMESTAMP).)+
以外的任何字符,其中TIMESTAMP
是上面的模式 - 向前看并捕获时间戳:只需使用上面的时间戳模式
您必须提前查找时间戳,而不是通常匹配它,因为有问题的时间戳可能需要作为下一个匹配的一部分。
把它们放在一起,你得到:
str =
`[09:35:10.00]
1. Lorem ipsum...
[09:35:13.11]
[09:35:15.14]
2. sed do eiusmod...
[09:35:39.20]
3. anim id est laborum...
[09:35:43.17]`
var re = /([d{2}:d{2}:d{2}.d{2}])((?:(?![d{2}:d{2}:d{2}.d{2}]).)+)(?=([d{2}:d{2}:d{2}.d{2}]))/gs;
const matches = str.matchAll(re);
for (const match of matches) {
console.log(`Start TC:n${match[1]}nText:n${match[2]}nTC2:n${match[3]}`);
}
或者,注释正则表达式:
const pattern = makeExtendedRegExp(String.raw`
( # First capture group: timestamp
[d{2}:d{2}:d{2}.d{2}]
)
( # Second capture group: text
(?:(?!
# Timestamp pattern again:
[d{2}:d{2}:d{2}.d{2}]
).)+
)
(?=( # Look ahead for and capture the timestamp in 3rd group:
# Timestamp pattern again:
[d{2}:d{2}:d{2}.d{2}]
))
`, 'gs');
function makeExtendedRegExp(inputPatternStr, flags) {
const cleanedPatternStr = inputPatternStr
.replace(/(^|[^\]) *#.*/g, '$1')
.replace(/^s+|s+$|n/gm, '');
return new RegExp(cleanedPatternStr, flags);
}
str =
`[09:35:10.00]
1. Lorem ipsum...
[09:35:13.11]
[09:35:15.14]
2. sed do eiusmod...
[09:35:39.20]
3. anim id est laborum...
[09:35:43.17]`
const matches = str.matchAll(pattern);
for (const match of matches) {
console.log(`Start TC:n${match[1]}nText:n${match[2]}nTC2:n${match[3]}`);
}