【问题标题】:Parsing M3U file解析 M3U 文件
【发布时间】:2019-09-17 04:59:11
【问题描述】:

我正在尝试解析一个 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。

到目前为止,我已经创建了代码来获取电视名称,如下所示:

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);
                }

但我遇到了一些障碍,因为我不知道如何获取下一行的内容。

有什么建议吗?

【问题讨论】:

  • 试试这个\btvg-name="([^"]+)".*\r?\n(https?\S+)regex101.com/r/d3Onzy/1
  • ... 如果您想捕获第三组(例如,如果 group-title 存在),您可以使用:\btvg-name="([^"]+ )".*\r?\bgroup-title="([^"]+)".*\r?\n(https?\S+)

标签: c# regex


【解决方案1】:

您可以使用 2 个捕获组,对于 tvg-name 的值,请使用与除 " 之外的任何字符匹配的否定字符类,而不是非贪婪的 .*?

值位于组 1 和组 2 中,可使用 Match.Groups 属性访问。

如果下一行应该以 http 开头,也许还有一个可选的 s:

\btvg-name="([^"]+)".*\r?\n(https?\S+)
  • \btvg-name= 匹配 tvg-name= 前面加上单词边界
  • "([^"]+)" 在双引号之间捕获 group 1,匹配除 " 之外的任何字符
  • .*\r?\n 匹配除换行符以外的任何字符 0 次以上,然后匹配换行符
  • (https?\S+) 捕获组 2,匹配 http、可选 s 和 1+ 次非空白字符

Regex demo | C# Demo

如何从组中获取值的示例:

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);
}

【讨论】:

  • @Martin 如果确实是,请将此解决方案标记为答案。
  • 如何添加 group-title 和 tvg-logo ?
  • @Web.11 如果属性的顺序相同,例如,您可以使用可选的非捕获组,其中包含捕获组。见regex101.com/r/9xyETO/1
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2019-10-29
  • 2017-06-08
  • 2022-12-03
  • 2012-06-10
  • 2011-09-21
相关资源
最近更新 更多