贵求一个正则的算法,诸位高手哥哥帮帮忙。立刻给分
有个html页面,我抓取的,我取得了div列表。<div class="msgCnt">我憋得慌,想去<span class='cKeyword'>厕所</span></div>
<div class="msgCnt">去<span class='cKeyword'>厕所</span>,是很简单的一件事</div>
<div class="msgCnt">我旁边就有一个公共<span class='cKeyword'>厕所</span>,不是很卫生的<span class='cKeyword'>厕所</span></div>
<div class="msgCnt">在<span class='cKeyword'>厕所</span>内,不要随地大小便,乱仍垃圾,是很不好的习惯。我们都是文明的社会公民,讲究道德的良民。</div>
<div class="msgCnt">不能去厕所啊!</div>
这个列表节点集以,以循环的形式,可以逐个遍历出来。
我想查找出,每个带“厕所”两个字,但是div里的文本内容长度不能超过25的,重点查出"想去厕所","要去厕所"的节点。
不要求绝对精准的能查出全部要去厕所的节点,但尽可能查出来大部分。
是不是很难啊,我写了3天,写得晕头转向的。条件太多了。有高手吗?进来一下。
--------------------编程问答-------------------- 表示正则不太行,等高手 --------------------编程问答-------------------- 理论上div结构不能用正则表达式表示,因为div可以嵌套,最好用字符串搜索匹配, --------------------编程问答-------------------- 没有会的么? --------------------编程问答-------------------- 这种问题用HtmlAgilityPack之类的第三方类库,用不了5分钟的时间。 --------------------编程问答-------------------- 正则的方法试试这个,我把html代码存网站根目录下test.txt文件里了。
string s = File.ReadAllText(Server.MapPath("~/test.txt"));--------------------编程问答--------------------
Regex r = new Regex(@"<div *[\s\S]*?>[\s\S]*?厕所[\s\S]*?</div>");
MatchCollection matches = r.Matches(s);
XmlDocument xml = new XmlDocument();
foreach (Match match in matches)
{
xml.LoadXml(match.Value);
string text = xml.DocumentElement.InnerText;
if (text.Length <= 25)
Response.Write(Server.HtmlEncode(match.Value) + "<br/>");
}
这个类库我正在用,确实很好用,但是取完节点列表,必然要用到正则什么,再次做细化处理,就卡在这里了 --------------------编程问答--------------------
--------------------编程问答-------------------- 这例子举得太邪恶了 --------------------编程问答-------------------- 顶,学习中!! --------------------编程问答-------------------- --------------------编程问答-------------------- 不是很理想 --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace sxLdfang
{
class Program
{
static void Main(string[] args)
{
string html = @"有个html页面,我抓取的,我取得了div列表。
<div class=""msgCnt"">我憋得慌,想去<span class='cKeyword'>厕所</span></div>
<div class=""msgCnt"">去<span class='cKeyword'>厕所</span>,是很简单的一件事</div>
<div class=""msgCnt"">我旁边就有一个公共<span class='cKeyword'>厕所</span>,不是很卫生的<span class='cKeyword'>厕所</span></div>
<div class=""msgCnt"">在<span class='cKeyword'>厕所</span>内,不要随地大小便,乱仍垃圾,是很不好的习惯。我们都是文明的社会公民,讲究道德的良民。</div>
<div class=""msgCnt"">不能去吃饭啊!</div>
<div class=""msgCnt"">不能去厕所啊!</div>
";
string pattern = @"(?is)(?<=<div\b[^>]*>).*?(?=</div>)";
MatchCollection mc = Regex.Matches(html, pattern);
foreach (Match m in mc)
{
string s=Regex.Replace(m.Value,"<[^>]+>","");
if(s.Length<25 && Regex.IsMatch(s,"厕所"))
{
Console.WriteLine(s);
}
}
Console.ReadKey();
}
}
}
运行结果:
我憋得慌,想去厕所
去厕所,是很简单的一件事
我旁边就有一个公共厕所,不是很卫生的厕所
不能去厕所啊!
string str = @"有个html页面,我抓取的,我取得了div列表。--------------------编程问答-------------------- 我是姐姐,观望...
<div class=""msgCnt"">我憋得慌,想去<span class='cKeyword'>厕所</span></div>
<div class=""msgCnt"">去<span class='cKeyword'>厕所</span>,是很简单的一件事</div>
<div class=""msgCnt"">我旁边就有一个公共<span class='cKeyword'>厕所</span>,不是很卫生的<span class='cKeyword'>厕所</span></div>
<div class=""msgCnt"">在<span class='cKeyword'>厕所</span>内,不要随地大小便,乱仍垃圾,是很不好的习惯。我们都是文明的社会公民,讲究道德的良民。</div>
<div class=""msgCnt"">不能去吃饭啊!</div>
<div class=""msgCnt"">不能去厕所啊!</div>
";
Regex reg = new Regex(@"(?is)<([^\s]+)[^>]*?>(?:(?!厕所)\w)*厕所(?:(?!</?\1).)*?</\1>");
foreach (Match m in reg.Matches(str))
Console.WriteLine(m.Value);
Console.ReadLine();
/*
<span class='cKeyword'>厕所</span>
<span class='cKeyword'>厕所</span>
<span class='cKeyword'>厕所</span>
<span class='cKeyword'>厕所</span>
<span class='cKeyword'>厕所</span>
<div class=""msgCnt"">不能去厕所啊!</div>
*/
补充:.NET技术 , C#