0

我有一个 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 ____________________
_____
4

2 回答 2

1
  • \w只是一个字符,你可能想说一个或多个 - \w+

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

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

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

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

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

图案:

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

C# 测试

于 2013-08-07T09:48:13.153 回答
1

尝试类似的东西

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>

于 2013-08-07T09:51:02.883 回答