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

泰勒·阿克利

我正在搜索数据库以查找带有视频信息的跨度标签,以便进行迁移。

我的正则表达式运行良好,我可以提取大部分我需要的信息。我遇到的问题是当样式标签的位置与预期不同时。这会抛出表达式并导致我期望的捕获量的大约 2/3。

如果我尝试将样式捕获组嵌套在主捕获组中,则无法捕获任何内容。我也尝试使用负/正前瞻,但只有在我将其设为可选捕获组时才有效。我认为问题在于我没有正确嵌套它。大多数相关问题都给出了否定回顾的答案,但我的理解是这更像是一个断言/量词。

那么我怎样才能始终捕获样式标签,而不管它在 span 标签中的位置呢?

正则表达式风格是 .NET(服务器端)

我有一个Regexr设置

/(?<tag><span class='vidly-vid' 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.+)'.+<\/span>)/gmi

样本数据

所有这些都应该匹配。第一个没有,其他三个没有。

<span class='vidly-vid' data-thumb='https://cf1234.cloudfront.net/Vids/Thumbnails/691DBB43-5EC8-4D57-AF7B-99896D9BD5D1_19127.jpg' data-aspect-ratio='4:3' style='border-width: 0px; width: 352px; height: 240px;' data-sources='[{"file":"https://cf1234.cloudfront.net/Vids/6v1j0a/hls.m3u8","label":"HD"},{"file":"https://cf1234.cloudfront.net/Vids/6v1j0a/mp4_360.mp4","label":"360p SD"}]'>&#160;</span>

<span class='vidly-vid' data-thumb='https://cf1234.cloudfront.net/Vids/Thumbnails/b181cfa5-565d-470a-b93a-2610987bb4da_28142.jpg' data-aspect-ratio='160:117' data-sources='[{"file":"https://cf1234.cloudfront.net/Vids/b181cfa5-565d-470a-b93a-2610987bb4da/hls.m3u8","label":"HD"},{"file":"https://cf1234.cloudfront.net/Vids/b181cfa5-565d-470a-b93a-2610987bb4da/mp4_480.mp4","label":"480p SD"},{"file":"https://cf1234.cloudfront.net/Vids/b181cfa5-565d-470a-b93a-2610987bb4da/mp4_360.mp4","label":"360p SD"},{"file":"https://cf1234.cloudfront.net/Vids/b181cfa5-565d-470a-b93a-2610987bb4da/mp4_720.mp4","label":"720p HD"},{"file":"https://cf1234.cloudfront.net/Vids/b181cfa5-565d-470a-b93a-2610987bb4da/mp4_1080.mp4","label":"1080p HD"}]' style='border-width: 0px; width: 600px; height: 480px;'>&#160;</span>

<table align="left" border="0" cellpadding="5" cellspacing="5" style="width:600px">   <tbody>    <tr>     <td><img alt="" src="/content/generator/Course_90016206/Case-10-LMLO_MG_FLAVOR1label.jpg" style="height:497px; width:324px" /></td>     <td><span class='vidly-vid' data-thumb='https://cf1234.cloudfront.net/Vids/Thumbnails/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414_28142.jpg' data-aspect-ratio='146:225' data-sources='[{"file":"https://cf1234.cloudfront.net/Vids/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414/hls.m3u8","label":"HD"},{"file":"https://cf1234.cloudfront.net/Vids/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414/mp4_480.mp4","label":"480p SD"},{"file":"https://cf1234.cloudfront.net/Vids/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414/mp4_360.mp4","label":"360p SD"},{"file":"https://cf1234.cloudfront.net/Vids/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414/mp4_720.mp4","label":"720p HD"},{"file":"https://cf1234.cloudfront.net/Vids/b2a7cbd3-5d31-49a5-bf89-aef0cf9f7414/mp4_1080.mp4","label":"1080p HD"}]' style='border-width: 0px; width: 324px; height: 500px;'>&#160;</span></td>    </tr>   </tbody>  </table>

<span class='vidly-vid' data-thumb='https://cf1234.cloudfront.net/Vids/Thumbnails/231913a7-b608-4d8b-9332-64b6840c22f0_28142.jpg' data-aspect-ratio='16:9' data-sources='[{"file":"https://cf1234.cloudfront.net/Vids/231913a7-b608-4d8b-9332-64b6840c22f0/hls.m3u8","label":"HD"},{"file":"https://cf1234.cloudfront.net/Vids/231913a7-b608-4d8b-9332-64b6840c22f0/mp4_480.mp4","label":"480p SD"},{"file":"https://cf1234.cloudfront.net/Vids/231913a7-b608-4d8b-9332-64b6840c22f0/mp4_360.mp4","label":"360p SD"},{"file":"https://cf1234.cloudfront.net/Vids/231913a7-b608-4d8b-9332-64b6840c22f0/mp4_720.mp4","label":"720p HD"},{"file":"https://cf1234.cloudfront.net/Vids/231913a7-b608-4d8b-9332-64b6840c22f0/mp4_1080.mp4","label":"1080p HD"}]' style='border-width: 0px; width: 920px; height: 520px;'>&#160;</span>
脱衣战士

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

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

Linqpad 示例 LINQPad 结果

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式捕获:将整个匹配项包含在捕获组中

来自分类Dev

Javascript正则表达式中的非捕获组

来自分类Dev

正则表达式:捕获组?

来自分类Dev

正则表达式非捕获组-没用吗?

来自分类Dev

正则表达式非捕获组ins Scala

来自分类Dev

正则表达式在Visual Studio中捕获组

来自分类Dev

正则表达式可选部分中的捕获组

来自分类Dev

正则表达式从红宝石中的非捕获组捕获

来自分类Dev

正则表达式:捕获组中的捕获组

来自分类Dev

Vim中的正则表达式以匹配组捕获

来自分类Dev

重复正则表达式捕获组的捕获部分

来自分类Dev

正则表达式中捕获组的奇怪行为

来自分类Dev

R正则表达式中的非捕获组

来自分类Dev

在捕获的组正则表达式上修剪空间

来自分类Dev

gsub中的Ruby正则表达式捕获组

来自分类Dev

Scala正则表达式中的多个捕获组

来自分类Dev

Grep非捕获组和同一正则表达式中的捕获组。仅打印捕获组

来自分类Dev

正则表达式中的非捕获组

来自分类Dev

如何捕获正则表达式中的可选组?

来自分类Dev

捕获MS Word正则表达式中的组

来自分类Dev

使用Python正则表达式在非捕获组中的多个捕获组

来自分类Dev

正则表达式捕获:将整个匹配项包含在捕获组中

来自分类Dev

正则表达式,捕获组

来自分类Dev

正则表达式捕获捕获组中的第二个单词

来自分类Dev

正则表达式捕获组

来自分类Dev

正则表达式从红宝石中的非捕获组捕获

来自分类Dev

正则表达式:捕获组中的替代字符

来自分类Dev

从 bash 脚本中的正则表达式捕获组

来自分类Dev

仅在正则表达式中捕获重复组