解析大型 M3U 文件时遇到问题

Posted

技术标签:

【中文标题】解析大型 M3U 文件时遇到问题【英文标题】:Trouble parsing a large M3U file 【发布时间】:2019-10-29 20:16:32 【问题描述】:

M3U 文件是一个播放列表文件,它包含描述媒体文件的条目列表、它们的名称、ID、类别等。 第一行是元数据,第二行是文件或流 URL。

示例:

#EXTINF:-1 tvg-id="ChannelName" tvg-name="|FR| Channel" tvg-logo="http://logo" timeshift="1" group-title="|FR| FrenchChannel",|FR| Channel Fullname
URL

我的文件包含大约 90,000 个条目和 160,000 行。重量约为 20Mb。

我想解析这个文件,并获取每个条目。我尝试使用这个正则表达式:

'(.+?),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)(.+)\s*(.+)\s*'

它为我提供了不同匹配组中的元数据、全名和 URL。它适用于不同的子集,包括 30,000 和 50,000 行。但是,在制作全套时,匹配时间太长了。当时我无法让它完成,不得不终止它。

我无法进行此解析,这是设计模式问题还是正则表达式太慢?我很困惑。

【问题讨论】:

重复键值对^(#\S+(?: [^\s="]+="[^"]+")+),(.*)\s(.*)查看regex101.com/r/OdaIcA/1 【参考方案1】:

一种选择可能是重复键值对而不是使用非贪婪的.+? 来防止不必要的回溯并省略积极的lookahhead (?=

^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)

说明

^ 字符串开始 (第一个捕获组 #\S+ 匹配 # 后跟 0+ 次非空白字符 (?: [^\s="]+="[^"]+")+ 重复 1+ 次键值对,前面加 1+ 次空白字符 )关闭第一组 ,(.*) 匹配逗号并捕获第 2 组中任何字符的 0+ 次 \s* 匹配 0+ 次空格字符 (.*)在第 3 组中捕获匹配任何字符 0+ 次

Regex demo

【讨论】:

它工作正常,除非一个键值对为空。正在尝试修复它:)。 尝试使用 asterix * 重复字符类 0 次以上,或者只使用不起作用的字符类 (?: [^\s="]*="[^"]*")+ 非常感谢,这就是我所做的更改,并且效果很好。在 10 秒内匹配整个文件。非常感谢您提供的帮助:)。祝你有美好的一天。

以上是关于解析大型 M3U 文件时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

android tv 中的 Exoplayer 不会在直播中重现 (.m3u8) 文件

如何使用 AVPlayer 解析 m3u 文件

解析大型 XML 文件失败--ERROR:Error Domain=DDXMLErrorDomain Code=1 "(null)"

从 m3u 播放列表流式传输直播电视频道

iPhone HTTP Streaming .m3u8 和 .ts 文件 - 如何使用 ffmpeg 创建

XML 试题