正则表达式 – 使用嵌套的div查找id的div内容

前端之家收集整理的这篇文章主要介绍了正则表达式 – 使用嵌套的div查找id的div内容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在任何人问之前,我没有做任何类型的屏幕抓取.

我正在尝试解析html字符串以找到具有特定id的div.我不能为我的生活得到这个工作.以下表达式在一个实例中有效,但在另一个实例中无效.我不确定它是否与html中的额外元素有关.

<div\s*?id=(\""|&quot;|&#34;)content(\""|&quot;|&#34;).*?>\s*?(?>(?! <div\s*?> | </div> ) | <div\s*?>(?<DEPTH>) | </div>(?<-DEPTH>) | .?)*(?(DEPTH)(?!))</div>

它正确地找到具有正确id的第一个div,但它然后在第一个结束div处关闭,而不是相关的div.

<div id="firstdiv">begining content<div id="content">some other stuff
    <div id="otherdiv">other stuff here</div>
    more stuff
    </div>
</div>

这应该带回来

<div id="content">some other stuff
   <div id="otherdiv">other stuff here</div>
   more stuff
</div>

,但由于某种原因,事实并非如此.它带回来:

<div id="content">some other stuff
      <div id="otherdiv">other stuff here</div>

有没有人有更容易的表达来处理这个?

为了澄清,这是在.NET中,我正在使用DEPTH关键字.你可以找到更多细节here.

在.NET中,您可以这样做:
(?<text>
(<div\s*?id=(\"|&quot;|&\#34;)content(\"|&quot;|&\#34;).*?>)

  (?>
      .*?</div>
    |
      .*?<div (?>depth)
    |
      .*?</div> (?>-depth)
  )*)
  (?(depth)(?!))
.*?</div>

您必须使用单行选项.以下是使用控制台的示例:

using System;
using System.Text.RegularExpressions;

namespace Temp
{
    class Program
    {
        static void Main()
        {
            string s = @"
<div id=""firstdiv"">begining content<div id=""content"">some other stuff
  <div id=""otherdiv"">other stuff here</div>
  more stuff
  </div>
</div>";
            Regex r = new Regex(@"(?<text>(<div\s*?id=(\""|&quot;|&\#34;)"
                + @"content(\""|&quot;|&\#34;).*?>)(?>.*?</div>|.*?<div "
                + @"(?>depth)|.*?</div> (?>-depth))*)(?(depth)(?!)).*?</div>",RegexOptions.Singleline);
            Console.WriteLine("HTML:\n");
            Console.WriteLine(s);
            Match m = r.Match(s);
            if (m.Success)
            {
                Console.WriteLine("\nCaptured text:\n");
                Console.WriteLine(m.Groups[4]);

            }
            Console.ReadLine();
        }
    }
}

猜你在找的正则表达式相关文章