无法解析大型 M3U 文件
Trouble parsing a large M3U file
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 行。但是,在处理完整集时,匹配的时间太长了。在我不能让它完成而不得不终止它的时候。
我无法使此解析工作,这是设计模式问题还是正则表达式太慢?我很困惑。
一个选项可能是重复键值对而不是使用非贪婪 .+?
来防止不必要的回溯并省略正 lookahhead (?=
:
^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)
说明
^
字符串开头
(
第一个捕获组
#\S+
匹配#后跟0+次非空白字符
(?: [^\s="]+="[^"]+")+
重复 1+ 次键值对,前面是 1+ 次空白字符
)
关闭组 1
,(.*)
匹配一个逗号并捕获 0+ 次第 2 组中的任何字符
\s*
匹配 0+ 次空白字符
(.*)
在组 3 中捕获匹配任何字符 0+ 次
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 行。但是,在处理完整集时,匹配的时间太长了。在我不能让它完成而不得不终止它的时候。
我无法使此解析工作,这是设计模式问题还是正则表达式太慢?我很困惑。
一个选项可能是重复键值对而不是使用非贪婪 .+?
来防止不必要的回溯并省略正 lookahhead (?=
:
^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)
说明
^
字符串开头(
第一个捕获组#\S+
匹配#后跟0+次非空白字符(?: [^\s="]+="[^"]+")+
重复 1+ 次键值对,前面是 1+ 次空白字符
)
关闭组 1,(.*)
匹配一个逗号并捕获 0+ 次第 2 组中的任何字符\s*
匹配 0+ 次空白字符(.*)
在组 3 中捕获匹配任何字符 0+ 次