解析多个组

时间:2013-08-07 09:26:47

标签: c# regex

我有一个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,因为它包含非alfanumeric字符。

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

4个div的所需匹配:

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

2 个答案:

答案 0 :(得分:1)

  • \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# Test

答案 1 :(得分: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>