我做了这个模式来匹配嵌套的div:

(<div[^>]*>(?:\g<1>|.)*?<\/div>)

这很好用,你可以在regex101中看到。

但是,当我在C#中编写下面的代码时:

Regex findDivs = new Regex("(<div[^>]*>(?:\\g<1>|.)*?<\\/div>)", RegexOptions.Singleline);

它抛出了一个错误:

Additional information: 
    parsing "(<div[^>]*>(?:\g<1>|.)*?<\/div>)" - 
        Unrecognized escape sequence \g.

正如你所看到的, \\g在c#中不起作用。 那我怎么能匹配第一个子模式呢?

===============>>#1 票数:3 已采纳

您正在寻找的是平衡群体 这是你的正则表达式与.NET的一对一转换:

(?sx)<div[^>]*>                   # Opening DIV
    (?>                           # Start of atomic group
        (?:(?!</?div[^>]*>).)+    # (1) Any text other than open/close DIV
        |   <div[^>]*> (?<tag>)   # Add 1 "tag" value to stack if opening DIV found 
        |   </div> (?<-tag>)      # Remove 1 "tag" value from stack when closing DIV tag is found
    )*
    (?(tag)(?!))                  # Check if "tag" stack is not empty (then fail)
</div>

请参阅正则表达式演示

但是,您可能真的想使用HtmlAgilityPack来解析HTML。

重点是获得一个XPath,它将匹配所有没有祖先同名的DIV标签。 你可能想要这样的东西(未经测试):

private List<string> GetTopmostDivs(string html)
{
    var result = new List<KeyValuePair<string, string>>();
    HtmlAgilityPack.HtmlDocument hap;
    Uri uriResult;
    if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp)
    { // html is a URL 
        var doc = new HtmlAgilityPack.HtmlWeb();
        hap = doc.Load(uriResult.AbsoluteUri);
    }
    else
    { // html is a string
        hap = new HtmlAgilityPack.HtmlDocument();
        hap.LoadHtml(html);
    }
    var nodes = hap.DocumentNode.SelectNodes("//div[not(ancestor::div)]");
    if (nodes != null)
        return nodes.Select(p => p.OuterHtml).ToList();
    else
        return new List<string>();
}

===============>>#2 票数:0

你想要做的是迭代捕获组。 这是一个例子:

foreach (var s in test)
{
    Match match = regex.Match(s);

        foreach (Capture capture in match.Captures)
        {
            Console.WriteLine("Index={0}, Value={1}", capture.Index, capture.Value);
            Console.WriteLine(match.Groups[1].Value);
        }   
}

  ask by João Ferreira translate from so

未解决问题?本站智能推荐: