这类嵌套正则如何写?通过id属性获得一个标签块
需求:就是通过id获得一个html标签块。
要处理的字符串:
<html><body><div id="div1"> <div id="div2" style="background:Red;"> <div id="div3"> <table id="table1"> <tr> <td> <div id="div4" style="width:100px"></div> </td> </tr> </table> </div> </div> <div id="div5"> <a href="http://www.csdn.net">csdn</a> </div></div><img src="http://www.csdn.net/Images/logo_csdn.gif"/></body></html>
<div id="div1"> <div id="div2" style="background:Red;"> <div id="div3"> <table id="table1"> <tr> <td> <div id="div4" style="width:100px"></div> </td> </tr> </table> </div> </div> <div id="div5"> <a href="http://www.csdn.net">csdn</a> </div></div>
<div id="div2" style="background:Red;"> <div id="div3"> <table id="table1"> <tr> <td> <div id="div4" style="width:100px"></div> </td> </tr> </table> </div> </div>
<div id="div3"> <table id="table1"> <tr> <td> <div id="div4" style="width:100px"></div> </td> </tr> </table> </div>
<table id="table1"> <tr> <td> <div id="div4" style="width:100px"></div> </td> </tr> </table>
using System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { string html = @"<html><body><div id=""div1""> <div id=""div2"" style=""background:Red;""> <div id=""div3""> <table id=""table1""> <tr> <td> <div id=""div4"" style=""width:100px""></div> </td> </tr> </table> </div> </div> <div id=""div5""> <a href=""http://www.csdn.net"">csdn</a> </div></div><img src=""http://www.csdn.net/Images/logo_csdn.gif""/></body></html>"; Console.WriteLine(html); string[] idList = { "div1", "div2", "div3", "div4", "table1" }; /* TODO : 这里发挥 */ string pattern = @"<([a-z]+)[^>]*\bid=(""|'){0}\2[^>]*></\1>"; foreach (string id in idList) { Match match = Regex.Match(html, string.Format(pattern, id), RegexOptions.Singleline | RegexOptions.IgnoreCase); Console.WriteLine("--------begin {0}--------", id); if (match.Success) Console.WriteLine(match.Value); else Console.WriteLine("o(╯□╰)o"); Console.WriteLine("--------end {0}--------", id); } Console.ReadKey(); } }}
可能还要考虑这种情况:
<img id="img1" src="images/ok.gif" />
并且 id='img1' 或 id=img1 ,在浏览器中似乎都能正常工作,如果也要考虑这些情形,就更麻烦了。
[解决办法]
o(╯□╰)o
对正则还没有研究得这么深... 平衡组都没有听说过 - -
要是我的话宁可自己分析标签,用stack来记录位置,顺便检查标签是否闭合。。。
[解决办法]
學習了
[解决办法]
<br> <hr> 写成 <br /> <hr /> 还好些,如果不写 /,就更不好判断闭合的情形了。
[解决办法]
Mark
[解决办法]
占位学习
[解决办法]
用正则处理貌似有困难
俺的正则还有待加强!
[解决办法]
太强了....留个脚印
[解决办法]
.
[解决办法]
我感觉用堆栈实现比较好。。。
还得研究一下。。。
[解决办法]
让俺先加个精再细细看~~
[解决办法]
我是过路的·············
[解决办法]
正则只会简单的呵呵。。。学习
[解决办法]
up
[解决办法]
路过,学习一下
[解决办法]
唉!我今天也要用到正则表达式,不过好像不会用似的,真失败
[解决办法]
完善一:增加了对以下标签类型的支持
<div id=div5> <a href="http://www.csdn.net">csdn</a> </div>
[解决办法]
正则只会用最简单的.
[解决办法]
lihai
[解决办法]
学习~
[解决办法]
在windows下开发桌面程序好像很少用到正则。
[解决办法]
学习……
[解决办法]
细节上优化了一下
string pattern = @"<([a-z]+)(?:(?!\bid\b)[^<>])*id=([""']?){0}\2[^>]*>(?>(?<o>)<\1[^>]*>|(?<-o>)</\1>|(?!</?\1).)*(?(o)(?!))</\1>";
[解决办法]
[解决办法]
mark
[解决办法]
<div id='div4' onclick="if(x>5){print('</div>')}"></div>
[解决办法]
<img id='img1' src='ok.gif' />
[解决办法]
(?(o)(?!)) (?# 这是一个条件测试,完整的形式形如 (?(group)(exp1)|(exp2)),或 group 匹配成功,则执行 exp1,否则执行 exp2)
(?# 因为 o 是一个平衡组,有入栈和出栈,若 o 全部出栈或根本未匹配到 o,则 (o) 为 false,正则引擎会继续匹配后续的表达式,即下面的 </\1>。若 o 未全部出栈,则 (o) 为 true,正则引擎会执行表达式 (?!),(?!) 总会导致匹配失败(因为空匹配总会成功,而对总会成功的匹配取反,则总会失败),从而导致正则引擎回溯,不去匹配最后的 </\1>。)
</\1> (?# 匹配分组 1 指定标签的闭合标签)
呵呵,个人的理解,有不当之外,敬请指正。
另外,个人认为正则的匹配能刚好达到要求最好,一是可以避免太复杂的表达式,难以看懂,二是效率问题。
[解决办法]
mark&&&
[解决办法]
头一次看见散400分的高人
[解决办法]
强大,就喜欢这些推荐的东西
[解决办法]
占位学习
[解决办法]
up
[解决办法]
很强大 但是没看懂
老大能不能给讲一下阿 谢谢!!
[解决办法]
up
[解决办法]
写这么复杂的正则用自动机来进行词法分析,会不会更好一些
[解决办法]
呵呵,确实越考虑越复杂了
基本上正则就是具体问题具体分析,有什么样的需求就写什么样的正则,适用就好
一些不常见的规则,等真正有这种需求的时候再扩展吧,否则只会增加复杂度,降低效率和可维护性
效率一直是正则招人诟病的地方,但这种效率问题很大程度上是因为使用不当导致的
正则本身就是一种有穷状态机,对于一些需求,我们完全可以自己写状态机搞定,只不过抽象程度不会有正则这么高罢了
[解决办法]
mark,有时间再来看