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