在任何人问之前,我没有做任何类型的屏幕抓取.
我正在尝试解析html字符串以找到具有特定id的div.我不能为我的生活得到这个工作.以下表达式在一个实例中有效,但在另一个实例中无效.我不确定它是否与html中的额外元素有关.
<div\s*?id=(\""|"|")content(\""|"|").*?>\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=(\"|"|&\#34;)content(\"|"|&\#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=(\""|"|&\#34;)" + @"content(\""|"|&\#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(); } } }