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行。重量在20兆左右。
我想解析这个文件,并获取每个条目。我试过用这个正则表达式:
'(.+?),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)(.+)\s*(.+)\s*'它为我获取不同匹配组中的元数据、全名和URL。它可以很好地工作在不同的子集上,包括3万行和5万行。然而,当处理完整的集合时,匹配的时间太长了。我不能让它结束而不得不终止它。
我无法让这个解析工作,这是一个设计模式问题,还是只是正则表达式太慢?我很困惑。
发布于 2019-06-15 14:16:45
一种选择可能是重复键值对,而不是使用非贪婪的.+?来防止不必要的回溯和省略正的查找头(?=。
^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)解释
^开始(第一次捕获组#\S+匹配#后面跟着一个非空格字符的0+时间(?: [^\s="]+="[^"]+")+重复1+,重复键值对,在键值对前面加上1+,再加上空格字符
)闭组1,(.*)匹配逗号并捕获第2组中任意字符的0+次数\s*匹配0+乘以空格字符(.*)捕获与任何字符0+时间相匹配https://stackoverflow.com/questions/56610938
复制相似问题