JS如何根据指定单词索引查找距离最近的正则匹配时间模式
实现方案
你原有代码的问题在于正则仅能匹配单个时间片段,且未开启全局匹配,只能拿到第一个符合规则的结果。你可以按照以下逻辑实现需求:
- 修正正则表达式,匹配完整的时间行,同时开启全局匹配
- 遍历所有匹配项,记录每个匹配项的起始索引
- 筛选出索引小于目标单词索引的所有匹配项,取起始索引最大的那一项,就是你要的距离最近的向前时间模式
可直接运行的代码
// st替换为你的完整字幕文本内容 const st = `"1 00:01:46,356 --> 00:01:49,893 What is this? It's blue. 2 00:01:50,794 --> 00:01:54,998 We used a different chemical process, but it is every bit as pure. 3 00:01:55,199 --> 00:01:58,267 It may be blue, but it's the bomb."`; // 单词chemical对应的索引位置 const targetWordIndex = 107; // 匹配完整时间行的正则,g为全局匹配修饰符 const timeRule = /\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}/g; let matchResult; let nearestTimeLine = null; let maxValidIndex = -1; // 循环遍历所有匹配项 while ((matchResult = timeRule.exec(st)) !== null) { // 仅保留索引小于目标单词索引的匹配项,同时更新最大有效索引 if (matchResult.index < targetWordIndex && matchResult.index > maxValidIndex) { maxValidIndex = matchResult.index; nearestTimeLine = matchResult[0]; } } console.log(nearestTimeLine); // 输出结果:00:01:50,794 --> 00:01:54,998
代码说明
- 正则里的
\d{2}等价于[0-9][0-9],写法更简洁 exec方法每次执行会返回当前匹配项的内容和起始索引,全局匹配模式下多次调用会依次向后查找- 遍历过程中我们只保留距离目标索引最近的前一个匹配项,最终得到的就是预期结果
内容的提问来源于stack exchange,提问作者moemous
相关产品推荐
相关产品推荐

