当前位置:编程学习 > C#/ASP.NET >>

贵求一个正则的算法,诸位高手哥哥帮帮忙。立刻给分

有个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/>");
}
--------------------编程问答--------------------
引用 4 楼 dalmeeme 的回复:
这种问题用HtmlAgilityPack之类的第三方类库,用不了5分钟的时间。

这个类库我正在用,确实很好用,但是取完节点列表,必然要用到正则什么,再次做细化处理,就卡在这里了 --------------------编程问答--------------------

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,