正在分析多个组

本文关键字: | 更新日期: 2023-09-27 18:26:39

我有一个HTML文件(我不能使用HTML AgilityPack),我想提取div的id(如果有)

<div id="div1">Street ___________________ </div>
<div id="div2">CAP |__|__|__|__|__| number ______ </div>
<div id="div3">City _____________________ State |__|__|</div>
<div id="div4">City2 ____________________ State2 _____</div>

我有一个提取下划线的模式__:[' _]{3,}

现在,如果我的下划线前面有一个div,我想提取它,如果没有,我只得到下划线。

到目前为止,我已经构建了这种模式(<div id(.+?)>('w)([' _]{3,}/*))([' _]{3,})

第一部分由3组组成1-div标签,2-标签,3-下划线

1-<div id(.+?)>,2-('w),3-[' _]{3,}/*

id为div2的div不会接受id,因为它包含非字母字符。

问:我的模式出了什么问题?

4个div的期望匹配:

<div id="div1">Street ___________________
______ 
<div id="div3">City _____________________
<div id="div4">City2 ____________________
_____

正在分析多个组

  • 'w只是一个单独的字符,您可能想说一个或多个-'w+

  • /*-零个或多个/?我看不出这在哪里合适。

  • 一个或多个非>的(即[^>]+)可能比.+?更好。.+?将尝试在第一个>处停止,但将继续,直到找到匹配的字符串,即:

    <div id=1>this is not valid</div><div id=2>this is valid___</div>
    

    将匹配整个字符串,而不是仅来自<div id=2>

  • 据我从你的问题中所知,下划线之前的所有内容都应该是可选的。

图案:

(?:(<div id[^>]+>)('w+))?([' _]{3,})

C#测试。

尝试类似的东西

string html = @"<div id=""div1"">Street ___________________ </div>
<div id=""div2"">CAP |__|__|__|__|__| number ______ </div>
<div id=""div3"">City _____________________ State |__|__|</div>
<div name=""hello"" id=""div4"">City _____________________ State |__|__|</div>
<div name=""house"">City _____________________ State |__|__|</div>
<div id=""notext""></div>";
var rx = new Regex(@"<div(?:(?: id=""(?<id>[^""]+)"")|[^>])*>(?<content>[^<]*)</div>", 
                   RegexOptions.IgnoreCase);
var matches = rx.Matches(html);
foreach (Match match in matches)
{
    var id = match.Groups["id"];
    var content = match.Groups["content"];
    Console.WriteLine("id present: {0}, id: {1}, text: {2}", 
                      id.Success, 
                      id.ToString(), 
                      content.ToString());
}

如果它有效,我将解释正则表达式(即<div(?:(?: id="(?<id>[^"]+)")|[^>])*>(?<content>[^<]*)</div>

相关文章:
  • 没有找到相关文章