匹配指定.ts文件最近的EXT-X-PROGRAM-DATE-TIME正则表达式需求
解决方案:匹配HLS播放列表中指定TS文件对应的最近时间标签
首先给出示例HLS播放列表:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:NO #EXT-X-TARGETDURATION:7 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:22.621+02:00 #EXTINF:6.666666667, seg1.ts #EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:29.637+02:00 #EXTINF:6.666666667, seg2.ts #EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:36.583+02:00 #EXTINF:6.666666666, seg3.ts
问题分析
你之前的正则EXT-X-PROGRAM-DATE-TIME:(.*)[\s\S]*?seg2.ts会匹配第一个时间标签,因为它从开头找到第一个EXT-X-PROGRAM-DATE-TIME后,就会匹配任意内容直到目标文件名,无法跳过前面的标签。要解决这个问题,核心是确保匹配的时间标签和目标文件名之间不再出现其他EXT-X-PROGRAM-DATE-TIME标签。
正确正则表达式
针对seg2.ts的正则:
EXT-X-PROGRAM-DATE-TIME:(.*?)(?:(?!EXT-X-PROGRAM-DATE-TIME)[\s\S])*?seg2\.ts
正则拆解
EXT-X-PROGRAM-DATE-TIME:(.*?):匹配时间标签,并用非贪婪模式捕获时间值,避免过度匹配后续内容(?:(?!EXT-X-PROGRAM-DATE-TIME)[\s\S])*?:非捕获组,匹配任意字符(包括换行),但通过负前瞻(?!EXT-X-PROGRAM-DATE-TIME)确保中间不会出现新的时间标签,这样就能锁定目标文件之前最近的那个时间标签seg2\.ts:匹配目标文件名,转义.避免匹配任意字符
适配说明
如果要匹配其他TS文件,只需将seg2\.ts替换为对应的文件名即可,比如匹配seg3.ts就改成seg3\.ts。这个正则完全兼容未来在文件名和时间标签之间新增其他HLS标签的场景,只要新增的标签不是EXT-X-PROGRAM-DATE-TIME就不会影响匹配结果。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

