c# - 解析 M3U 文件
问题描述
我正在尝试解析一个 m3u 文件,但遇到了问题。
M3U 文件如下所示:
#EXTM3U
#EXTINF:-1 tvg-id="6 eren" tvg-name="6'eren" tvg-logo="http://195.154.221.171/picons/6erendk.png" group-title="Denmark",6'eren
http://URL/something
#EXTINF:-1 tvg-id="6 eren" tvg-name="6'eren FHD" tvg-logo="http://195.154.221.171/picons/6erenhddk.png" group-title="Denmark",6'eren FHD
http://URL/something
#EXTINF:-1 tvg-id="6 eren" tvg-name="6'eren FHD" tvg-logo="http://195.154.221.171/picons/6erenhddk.png" group-title="Denmark",6'eren FHD
http://portal.siptveu.com:8080/8IsZPSZ7sc/IMd7O87LUj/9266
#EXTINF:-1 tvg-name="6'eren HD" group-title="Denmark",6'eren HD
http://URL/something
#EXTINF:-1 tvg-id="Animal Planet" tvg-name="Animal Planet FHD" tvg-logo="http://195.154.221.171/picons/animalplanethddk.png" group-title="Denmark",Animal Planet FHD
http://URL/something
#EXTINF:-1 tvg-id="Animal Planet" tvg-name="Animal Planet HD" tvg-logo="http://195.154.221.171/picons/animalplanethddk.png" group-title="Denmark",Animal Planet HD
http://URL/something
#EXTINF:-1 tvg-name="Boomerang" tvg-logo="http://195.154.221.171/picons/boomerangse.png" group-title="Denmark",Boomerang
http://URL/something
#EXTINF:-1 tvg-name="C More First FHD" group-title="Denmark",C More First FHD
http://URL/something
#EXTINF:-1 tvg-name="C More Hits FHD" group-title="Denmark",C More Hits FHD
http://URL/something
etc...
我需要获取 tvg-name 的值和同一条目的 URL。
到目前为止,我已经创建了代码来获取 tvg-name,如下所示:
List<Channel> ChannelList = new List<Channel>();
List<int> posOfTvgName = GetPositions(m3u, "tvg-name");
var reg = new Regex("tvg-name=\".*?\"");
var matches = reg.Matches(m3u);
foreach (var item in matches)
{
Channel c = new Channel();
string channelName = item.ToString();
channelName = item.ToString().Remove(0, 10);
channelName = channelName.Remove(channelName.Length - 1);
c.Name = channelName;
ChannelList.Add(c);
}
但是我遇到了一些障碍,因为我不知道如何获取下一行的内容。
有什么建议么?
解决方案
您可以使用 2 个捕获组,对于 tvg-name 的值,使用与任何字符匹配的否定字符类"
,而不是非贪婪字符.*?
这些值位于组 1 和组 2 中,可使用Match.Groups属性进行访问。
如果下一行应该以 http 开头,也许还有一个可选的 s:
\btvg-name="([^"]+)".*\r?\n(https?\S+)
\btvg-name=
tvg-name=
以单词边界为前缀的匹配"([^"]+)"
在双引号之间捕获组 1,匹配任何字符,除了"
.*\r?\n
匹配除换行符以外的任何字符 0+ 次,然后匹配换行符(https?\S+)
捕获组 2,匹配 http、可选 s 和 1+ 次非空白字符
如何从组中获取值的示例:
string pattern = @"\btvg-name=""([^""]+)"".*\r?\n(https?\S+)";
string input = @"#EXTM3U
#EXTINF:-1 tvg-id=""6 eren"" tvg-name=""6'eren"" tvg-logo=""http://195.154.221.171/picons/6erendk.png"" group-title=""Denmark"",6'eren
http://URL/something ...";
foreach (Match m in Regex.Matches(input, pattern))
{
Console.WriteLine("tvg-name: {0} URL: {1}" , m.Groups[1].Value, m.Groups[2].Value);
}
推荐阅读
- android - 如何从工具栏下方启动recyclerview
- openshift - openshift 秘密令牌到期
- javascript - HTML 表格单元格值计数器
- c++ - 外部 C++ 模块可以与 Arduino 一起使用吗?
- python - 3D分形切片渲染方法的验证
- python - 如何通过 to_timedelta() 转换一系列列
- python - Translating curl to python requests
- css - flex-shrink 基于每个元素的长度
- android - 用于从 UPnP 服务器到 VLCMedia palyer 播放带字幕视频的 Android 隐式意图
- amazon-s3 - AWS S3 静态软管:路由规则不适用于云端