继续求另一正则

beckfun 2011-12-01 02:25:39
蛋疼了,资历不够,依样画葫芦画不出来,只能继续来求助
现有这么一个html



<div class="table2">
<div class="vvAll1">
<div class="vv11">**********<div class="vv12">############</div></div>
<div class="vv13">###############</div>
</div>

<div class="vvAll2">
<div class="vv21">
<ul class="vv21Table">
<li><span class="vv21A">#########</span><span class="vv21B">*******</span></li>
<li><span class="vv21A">#########</span><span class="vv21D">******* </span></li>
</ul>
</div>

<div class="vv22">
<div class="vv22Txt1">*********************************</div>
<div class="vv22Txt2">############################</div>
<div class="vv22Txt3">############################</div>
</div>
</div>

<div class="notice3"><div class="notice1Txt">#############</div></div>


<div style="margin-bottom:50px;" class="vv22Txt4">
************************************

</div>
</div>



要匹配的是*的内容,#的内容是不需要,如果一条正则不能完成,也可以分条写!求关注!!!
...全文
156 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dalmeeme 2011-12-02
  • 打赏
  • 举报
回复
如果从字符串加载,可以用htmlDoc.LoadHtml("");
dalmeeme 2011-12-02
  • 打赏
  • 举报
回复
XPath表达式://*[@class='vv11' or @class='vv21B' or @class='vv21D' or @class='vv22Txt1' or @class='vv22Txt4']
的意思是选取文档中所有class值为vv11、vv21B、vv21D、vv22Txt1、vv22Txt4的节点。
haa17 2011-12-02
  • 打赏
  • 举报
回复
(?is)(?<=<(?:div|span)[^>]*?class="(?:vv11|vv22Txt1|vv22Txt4|vv21B|vv21D)">).*?(?=</?(?:div|span)[^>]*?>)



nb
dalmeeme 2011-12-02
  • 打赏
  • 举报
回复
其实就是用一个XPath表达式,按照class属性把要取的节点找出来,然后获取第一个子节点(文本节点)。
HtmlAgilityPack是第三方免费类库,下载地址:http://htmlagilitypack.codeplex.com/
项目中bin文件夹下加入dll和xml就行了,using HtmlAgilityPack;
dalmeeme 2011-12-02
  • 打赏
  • 举报
回复
可以用HtmlAgilityPack的HtmlDocument类获取节点:
我把楼主源文本中要获取的文本后面加上“值X”以示区别:

		HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load(Server.MapPath("~/test.txt"));
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes(@"//*[@class='vv11' or @class='vv21B' or @class='vv21D' or @class='vv22Txt1' or @class='vv22Txt4']");
foreach (HtmlNode node in nodes)
{
Response.Write(node.ChildNodes[0].InnerText + "<br/>");
}

结果:
**********值一
*******值二
******* 值三
*********************************值四
************************************值五
charles_y 2011-12-01
  • 打赏
  • 举报
回复
有规则有好办,楼上的可以,也可以硬写
比如

(?s)<div class="vv11">(?<one>.*?)<div.*?<span class="vv21B">(?<two>.*?)</span>.*?<span class="vv21D">(?<three>.*?)</span>.*?class="vv22Txt4">(?<four>.*?)</div>

取group["one"]...的值
遥望那些年 2011-12-01
  • 打赏
  • 举报
回复
像vv12,与它邻近的前一个div是vv11,是它的父节点
而vv22Txt2,与它临近的前一个div是vv22Txt1,是它的兄弟节点

这种嵌套顺序太乱了
q107770540 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 beckfun 的回复:]
我自己总结的规则,根据class类来取!
第一个取vvAll1——>vv11
第二个取vvAll2——>vv21——>vv21Table和vvAll2——>vv22——>vv22Txt1,里面的再根据第二个正则来处理!
第三个取vv22Txt4

四楼的方法我写过!就是要写三个,但是我把这三个拼成一个就不行!!!
[/Quote]
(?is)(?<=<(?:div|span)[^>]*?class="(?:vv11|vv22Txt1|vv22Txt4|vv21B|vv21D)">).*?(?=</?(?:div|span)[^>]*?>)
beckfun 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 charles_y 的回复:]

那个前面的 vv11,vv21 之类的是固定的吗? 如果是固定的也好办

真的没有规则的话,位置固定也行。
[/Quote]位置是固定的!
遥望那些年 2011-12-01
  • 打赏
  • 举报
回复
(?is)(?<=<div class="(vv11|vv21Table|vv22Txt1|vv22Txt4)">).*?(?=</div>)

你这个div有嵌套,而且嵌套顺序混乱,没法精确匹配div外层div的class
charles_y 2011-12-01
  • 打赏
  • 举报
回复
那个前面的 vv11,vv21 之类的是固定的吗? 如果是固定的也好办

真的没有规则的话,位置固定也行。
beckfun 2011-12-01
  • 打赏
  • 举报
回复
我自己总结的规则,根据class类来取!
第一个取vvAll1——>vv11
第二个取vvAll2——>vv21——>vv21Table和vvAll2——>vv22——>vv22Txt1,里面的再根据第二个正则来处理!
第三个取vv22Txt4

四楼的方法我写过!就是要写三个,但是我把这三个拼成一个就不行!!!
遥望那些年 2011-12-01
  • 打赏
  • 举报
回复
如果要匹配的是class为vv22Txt1的div
(?is)(?<=<div class="vv22Txt1">).*?(?=</div>)
beckfun 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sqlserver2008 的回复:]

有什么规律不?
[/Quote]可以说是没有规律!本想根据上一问题的答案,依样画葫芦自己写一个,怎么写都匹不上!
q107770540 2011-12-01
  • 打赏
  • 举报
回复
至少把规则说清楚点啊
SqlServer2008 2011-12-01
  • 打赏
  • 举报
回复
有什么规律不?

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧