在两个时间码之间匹配所有的时间码

3

我想生成多条路径,这些路径都基于视频的时间码。在某个时间段内,使用同一路线。

使用正则表达式是否可以获取两个时间码之间(含)的所有值?

有些正则表达式可以比较数字。该正则表达式匹配所有大于954的数字。

/[1-9]\d{3,}|9[6-9]\d|9[5-9]{2}/g

但是是否可能使用正则表达式替换掉朴素的比较方式来进行下列对比呢?

00:00<00:01 // should get 00:00 and 00:01 but not 00:02
00:00<00:02 // should get 00:00, 00:01 and 00:02

附加背景:使用path-to-regexp,我可以做像/:lang(en|es)这样的匹配英语或西班牙语的事情。 我正在尝试通过传入 /:timecode(regexp) 来匹配两个时间代码之间的任何时间代码。

这将为/00:00/00:01提供相同的路由路径


1
我建议您将时间码转换为时间变量,这样您就可以轻松地进行数学计算。 - Poul Bak
你使用什么编程语言? - Poul Bak
你的链接正则表达式匹配的是时间范围而不是具体时间,你能澄清一下吗?无论如何,如果给定一个开始时间和结束时间,你需要更多的东西来匹配它们之间的所有时间,而不仅仅是纯正则表达式。然而,一种编程语言可以生成一个匹配它们的正则表达式(但可能没有正则表达式做得好)。 - Aaron
3
范围的正则表达式非常丑陋、冗长,编写起来非常麻烦。正则表达式并不是最好的工具。我建议将其转换为单个整数值(例如,自午夜以来的秒数或自上一小时以来的秒数等),并使用数学方法检查该值是否在低/高值范围内。 - Bohemian
1
你的问题是什么?你想知道如何创建这样的正则表达式吗? - JojOatXGME
显示剩余3条评论
1个回答

1

一般来说,使用正则表达式可能不是最佳解决方案。根据工具的不同,可能会有更好的解决方案。但是,这是可能的。

如何创建正则表达式

假设我们的时间码始终具有以下格式:mm:ss。您可能希望匹配所有从22:2277:77的时间码。这意味着当以下语句之一为真时,正则表达式应该匹配。

  • 时间码以2开头,其余字符串为2:22或更高。
  • 时间码以3456开头。
  • 时间码以7开头,其余字符串为7:77或更低。

这意味着至少有以下三个正则表达式之一必须匹配:

  • /2{2:22或更高}/
  • /[3-6]\d:\d\d/
  • /7{7:77或更低}/
这意味着最终的正则表达式看起来会像下面这样。花括号({})中的部分将在后面解析。
/2{2:22 or higher}|[3-6]\d:\d\d|7{7:77 or lower}/

现在,我们需要解决 {2:22 或更高}{7:77 或更低}。一个形如 x:xx 的字符串是 2:22 或更高,当以下语句之一为真时。
  • 字符串以2:开头,其余部分为22或更高。
  • 字符串以3456789开头。
因此,{2:22 或更高} 可以写成
/2:{22 or higher}|[3-9]:\d\d/

现在我们有以下内容。
/2(2:{22 or higher}|[3-9]:\d\d)|[3-6]\d:\d\d|7{7:77 or lower}/

你可以重复这些步骤,直到没有被花括号 ({}) 包围的部分剩余。结果可能如下所示。
/2(2:(2[2-9]|[3-9]\d)|[3-9]:\d\d)|[3-6]\d:\d\d|7(7:(7[0-7]|[0-6]\d)|[0-6]:\d\d)/

https://regex101.com/r/AsfRQt/1/tests


这真的很酷,非常感谢。在看到你的答案 (([0-5].[0-9]?|60)(?:[:])([0-5].[0-9]?|60)) 之前,我一直卡在这个阶段...离解决方案还有很远的路要走!再次感谢。 - aquiseb
@AstenMies 我刚意识到时间码在冒号后面超过60秒是不太合理的。 :D 不过,我想这个过程仍然是可以理解的。 - JojOatXGME
是的,我以为你一定有一只非常不寻常的手表;)但实际上这并不重要,它是可以理解的。 - aquiseb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接