Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获组中的正则表达式捕获组_C#_.net_Regex - Fatal编程技术网

C# 捕获组中的正则表达式捕获组

C# 捕获组中的正则表达式捕获组,c#,.net,regex,C#,.net,Regex,为了便于迁移,我正在数据库中搜索带有视频信息的span标记 我的正则表达式运行良好,我可以提取大部分所需的所有信息。我遇到的问题是,样式标记的位置与预期的不同。这就抛开了表达式,产生了我所期望的大约2/3的捕获结果 如果我尝试将样式捕获组嵌套在主捕获组中,它将无法捕获任何内容。我也尝试过使用消极/积极的lookaheads,但只有当我将其作为可选的捕获组时,它才会起作用。我想问题是我没有正确地嵌套它。大多数相关问题的答案都是否定的,但我的理解是,这更多的是一个断言/量词 那么,无论样式标记在跨度

为了便于迁移,我正在数据库中搜索带有视频信息的span标记

我的正则表达式运行良好,我可以提取大部分所需的所有信息。我遇到的问题是,样式标记的位置与预期的不同。这就抛开了表达式,产生了我所期望的大约2/3的捕获结果

如果我尝试将样式捕获组嵌套在主捕获组中,它将无法捕获任何内容。我也尝试过使用消极/积极的lookaheads,但只有当我将其作为可选的捕获组时,它才会起作用。我想问题是我没有正确地嵌套它。大多数相关问题的答案都是否定的,但我的理解是,这更多的是一个断言/量词

那么,无论样式标记在跨度标记中的位置如何,如何始终捕获样式标记呢

Regex风格是.NET服务器端

我有个安排


/我个人只是将正则表达式分成更易于管理的块,如下所示:

var spanRegex = new Regex(@"<span class='vidly-vid'.+<\/span>");
var attrRegexes = new[]{
    @"data-thumb='(?<thumb>http.+\.jpg)'",
    @"aspect-ratio='(?<aspect>\d{1,3}:\d{1,3})'",
    @"sources='\[{""file"":.+""(?<src>(?<uri>https:\/\/cf1234.cloudfront\.net\/Vids\/)(?<key>(?<ident>[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}|[a-z0-9]{6})\/(?<mp4>mp4_1080.mp4|mp4_720.mp4|mp4_480.mp4|mp4_360.mp4|mp4.mp4)))",
    @"style='(?<style>.+width: (?<width>.+)px.+height: (?<height>.+)px.+)'",
}
.Select(r => new Regex(r))
.ToList();
var results = inputs.Select(i => spanRegex.Match(i).Value)
    .Select(i => new
    {
        i,
        attributes = 
            from r in attrRegexes
            let match = r.Match(i)
            from g in match.Groups.Cast<Group>().Skip(1)
            select new {g.Name, capture = g.Value}
    });

您是否尝试过使用HTML解析器?哦,天哪,维护和排除正则表达式模式一定是一件非常愉快的事情-换句话说:第一条评论说的是什么…链接。哇-我错过了。听起来我应该让样式捕获组成为可选的,然后猜测它是否丢失了,因为这是我唯一缺少的部分。是的,或者你可以退一步,使用一系列简单的正则表达式和一个小C将它们串在一起,而不是试图在一个巨大的正则表达式中获取所有的捕获。例如,我打赌一旦你确定了目标跨度,你就可以想出一个正则表达式,它可以很好地从中获取样式标签。
var spanRegex = new Regex(@"<span class='vidly-vid'.+<\/span>");
var attrRegexes = new[]{
    @"data-thumb='(?<thumb>http.+\.jpg)'",
    @"aspect-ratio='(?<aspect>\d{1,3}:\d{1,3})'",
    @"sources='\[{""file"":.+""(?<src>(?<uri>https:\/\/cf1234.cloudfront\.net\/Vids\/)(?<key>(?<ident>[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}|[a-z0-9]{6})\/(?<mp4>mp4_1080.mp4|mp4_720.mp4|mp4_480.mp4|mp4_360.mp4|mp4.mp4)))",
    @"style='(?<style>.+width: (?<width>.+)px.+height: (?<height>.+)px.+)'",
}
.Select(r => new Regex(r))
.ToList();
var results = inputs.Select(i => spanRegex.Match(i).Value)
    .Select(i => new
    {
        i,
        attributes = 
            from r in attrRegexes
            let match = r.Match(i)
            from g in match.Groups.Cast<Group>().Skip(1)
            select new {g.Name, capture = g.Value}
    });