正则递归匹配闭合标签

最近在做一些采集的时候,总是匹配信息不完整,原因是无法匹配对应的闭合标签


比如:

<span class="blank20"></span>
<div class="vT_z w760">
	<div class="vT_detail_nav">
    	<div class="vT_detail_nav_logo"><img src="/images/slogo.gif" /></div>
        <div class="vT_detail_nav_lks"><a href="../../../" class="CurrChnlCls">首页</a> » <a href="../../" class="CurrChnlCls">地方标讯</a> » <a href="../" class="CurrChnlCls">中标公告</a></div>
    </div>
    <div class="vT_detail_main">
        	<div class="vT_detail_header"><h2 class="tc">重庆邮电大学工业反求设计系统与工控安全系统采购结果公示(项目编号=JZH2014102102(14A4558 ))</h2>
            <p class="tc"><span id="pubTime">2014年11月11日 10:12</span> 来源:<span id="sourceName"></span> 【<span id="printBtn">打印</span>】 <span id="shareTo"></span></p></div>
            <span class="blank20" id="slicedLine"></span>

            <div class="vT_detail_content w760c">
            	<style type="text/css">	a,table{font-size:10pt;}	#bulletinContent{border-collapse:collapse;}	#bulletinContent tr{height:7mmr;}	.tableHeader{background-color:#ABCDEF;}</style><script type="text/javascript">	<!--	var currentpos,timer;	function initialize(){		timer=setInterval("scrollwindow()",60);	}	function sc(){		clearInterval(timer);	}	function scrollwindow(){		window.scrollBy(0,1);	}	document.onmousedown=sc	document.ondblclick=initialize	//--></script><br /><br /><table style="width: 170mm; height: 160mm" border="0" cellspacing="1" cellpadding="0" bgcolor="#cccccc" align="center">    <tbody>        <tr>            <td bgcolor="#ffffff" valign="top">            <table border="0" cellspacing="0" cellpadding="0" width="98%" bgcolor="#ffffff" align="center" height="150">                <tbody>                    <tr>                        <td class="title_cn" height="60" valign="bottom" align="center"><font size="3" face="黑体"><font size="4">重庆邮电大学工业反求设计系统与工控安全系统采购结果公告</font> </font></td>                    </tr>                    <tr>                        <td class="title_cn" valign="bottom" align="center">                        <table style="display: none" border="0" cellspacing="0" cellpadding="5" width="100%" align="center">                            <tbody>                                <tr>                                    <td align="right"><img alt="" align="absMiddle" width="15" height="15" src="http://www.cqgp.gov.cn/styles/site/info.gif" /> 双击鼠标自动滚屏 [<a href="javascript:window.print();">打印此页</a>] [<a href="javascript:window.close()">关闭此页</a>]</td>                                </tr>                            </tbody>                        </table>                        </td>                    </tr>                    <tr>                        <td class="title_cn" height="30" valign="middle" align="center"><hr style="border-bottom: black 1px dashed; background-color: transparent; width: 98%; height: 1px" />                        </td>                    </tr>                </tbody>            </table>            <table style="width: 150mm" id="bulletinContent" border="1" rules="rows" cellspacing="0" bordercolor="#f0f0f0" cellpadding="6" frame="void" align="center">                <colgroup valign="top"><col width="28%" /><col width="72%" /></colgroup>                <tbody>                    <tr>                        <td>项目名称:</td>                        <td>重庆邮电大学工业反求设计系统与工控安全系统</td>                    </tr>                    <tr>                        <td>采购编号:</td>                        <td>JZH2014102102(14A4558 )</td>                    </tr>                    <tr>                        <td>评审日期:</td>                        <td>2014年11月05日</td>                    </tr>                    <tr>                        <td>公告日期:</td>                        <td>2014年11月11日</td>                    </tr>                    <tr>                        <td>采购方式:</td>                        <td>竞争性谈判</td>                    </tr>                    <tr>                        <td>采购人名称:</td>                        <td>重庆邮电大学</td>                    </tr>                    <tr>                        <td>采购人地址:</td>                        <td>重庆市南岸崇文路2号</td>                    </tr>                    <tr>                        <td>采购代理机构名称:</td>                        <td>重庆邮电大学</td>                    </tr>                    <tr>                        <td>采购代理机构地址:</td>                        <td>重庆市南岸区崇文路2号</td>                    </tr>                    <tr>                        <td>项目负责人:</td>                        <td>重庆邮电大学</td>                    </tr>                    <tr>                        <td>联系电话:</td>                        <td>62471126</td>                    </tr>                    <tr>                        <td>评标委员会成员名单:</td>                        <td>陈杰、严利、王浩</td>                    </tr>                    <tr>                        <td colspan="2">                        <table style="width: 100%; border-collapse: collapse" id="projectBundleList" border="1" cellspacing="0" bordercolor="#aaaaaa" cellpadding="4" align="center">                            <tbody>                                <tr class="tableHeader">                                    <td>包号</td>                                    <td>分包名称</td>                                    <td>评审日期</td>                                    <td>中标金额(元)</td>                                    <td>中标供应商</td>                                    <td>备注</td>                                </tr>                                <tr>                                    <td>1</td>                                    <td>工业反求设计系统</td>                                    <td>2014年11月05日</td>                                    <td>442000.0</td>                                    <td>重庆佛商科技有限公司</td>                                    <td> </td>                                </tr>                                <tr>                                    <td>2</td>                                    <td>3D打印机</td>                                    <td>2014年11月05日</td>                                    <td>299000.0</td>                                    <td>成都曼恒数字技术有限公司</td>                                    <td> </td>                                </tr>                                <tr>                                    <td>3</td>                                    <td>工控安全系统</td>                                    <td>2014年11月05日</td>                                    <td>919900.0</td>                                    <td>重庆市人通科技发展有限公司</td>                                    <td> </td>                                </tr>                            </tbody>                        </table>                        </td>                    </tr>                    <tr>                        <td colspan="2"> </td>                    </tr>                </tbody>            </table>            <div style="height: 15px"> </div>            </td>        </tr>    </tbody></table>
            </div>
        </div>
</div>

匹配 <div class="vT_detail_content w760c">与与之对应的 </div> 之间的内容,用一般的正则 (?<=<div class="vT_detail_content w760c">)[\s\S]*?(?=</div>) 总是会匹配不完整,因为内部有其他 div 的嵌套了


从网上翻了翻,没有专门介绍如何匹配完整标签的方式,同时,.net 无法使用 (?R) 来进行递归匹配,只有一些文章结合了关于正则计算深度的文章


http://www.360doc.com/content/06/0220/12/73_69675.shtml


然后,自己就尝试把这个正则进行了一下变形,得到以下正则

<(div)(?!\w)[^<>]*>(([^<>]|<(?!/?\1(?!\w))[^<>]*>)*|<\1(?!\w)[^<>]*>(?<DEPTH>)|</\1(?!\w)[^<>]*>(?<-DEPTH>))*(?(DEPTH)(?!))</\1(?!\w)[^<>]*>

加粗的 div 为要匹配的标签名

第一对红色<>之间可追加标签限定条件

第一对红色<>之后与(之前可追加内容限定条件

绿色部分为深度计算与验证部分


测试过程如下

            string res = re.Match(@"before ((nope (ye(s) (here) okay) after)").Value;
            Regex re1 = new Regex(@"<(div)(?!\w)[^<>]*?id=loginleft[^<>]*>(([^<>]|<(?!/?\1(?!\w))[^<>]*>)*|<\1(?!\w)[^<>]*>(?<DEPTH>)|</\1(?!\w)[^<>]*>(?<-DEPTH>))*(?(DEPTH)(?!))</\1(?!\w)[^<>]*>", RegexOptions.IgnoreCase);
            string htm = @"<div class=""public_head"">
  <div class=""wrap topbar"">
    <div class=""topbar_left"" id=loginleft>
      <script language=""javascript"" type=""text/javascript"" src=""/js/Topbarnew.asp""></script>
      <!-- Baidu Button BEGIN -->
    <div id=""bdshare"" class=""bdshare_t bds_tools get-codes-bdshare"" data=""{'wbuid':2084070357}"">
     <a class=""bds_tsina""></a>
        <a class=""bds_tqq""></a>
        <a class=""bds_renren""></a>        
        <a class=""bds_qzone""></a>
       <span class=""bds_more""> </span>
    </div>
<script type=""text/javascript"" id=""bdshare_js"" data=""type=tools&uid=520245"" ></script>
<script type=""text/javascript"" id=""bdshell_js""></script>
<script type=""text/javascript"">
	document.getElementById(""bdshell_js"").src = ""http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion="" + new Date().getHours();
</script>
<!-- Baidu Button END -->
 <div class=""clear""></div>
    </div>
    <div class=""topbar_right"">
      <ul>
       <li style=""background:none""><a href=""/about/Member.html"">本站服务</a></li>
        <li><a href=""#"" onclick=""javascript:window.external.AddFavorite(location.href,'xxxx')"" title=""收藏本站到你的收藏夹"">加入收藏</a></li>
        <li><a href=""#"" onclick=""this.style.behavior='url(#default#homepage)';this.sethomepage(location.href);"">设为首页</a></li>
        <li><a href=""/trade/add_buy.asp"" target=""_blank"" style=""color:#F00"">发布求购信息</a></li>
      </ul>
    </div>
    <div class=""clear""></div>
  </div>
</div>";
            string res1 = re1.Match(htm).Value;


你可能感兴趣的:(正则递归匹配闭合标签)