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行的不同子集。但是,当处理完整集时,匹配花费的时间太长。在这一点上,我不能让它完成而不得不终止它。
我无法使该解析正常工作,这是设计模式问题还是正则表达式太慢?我很困惑
答案 0 :(得分:2)
一种选择可能是重复键值对,而不是使用非贪婪的s
来防止不必要的回溯并省略正向旁白.+?
:
(?=
说明
^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)
字符串的开头^
第一个捕获组
(
匹配#后跟0+倍的非空格字符#\S+
重复1+次键值对,再加上1+次空格字符(?: [^\s="]+="[^"]+")+
关闭第1组)
匹配逗号并捕获组2中任何字符的0+次,(.*)
匹配0+次空白字符\s*
在组3中捕获,匹配0次以上的任何字符