求一个正则表达式,能够从HTML中解析出下面的TR
可以用TR的 onmouseover onmouseout 等关键字解析。。<tr bgcolor="#FFFF99" onmouseover="this.bgColor='#FFCCCC'" onmouseout="this.bgColor='#FFFF99'">
        <td width="108" height="25">
            <a href="/url.htm?u=http://www.123.com/" target="_blank">测试测试</a>
        </td>
        <td width="108">
            121.12.105.213
        </td>
        <td width="180">
            2009年 5月3日 晚上11点59分
        </td>
        <td width="84" align="center">
            测试测试
        </td>
        <td>
            <table width="100%" border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td>
                        <a href="/url.htm?u=http://www.123.com/" target="_blank">测试测试</a>
                    </td>
                </tr>
            </table>
        </td>
        <td width="108">
            测试测试
        </td>
        <td width="68" align="center">
            <a href="/url.htm?u=http://www.123.com/" target="_blank">点击查看</a>
        </td>
    </tr>

解决方案 »

  1.   

    你是要从html中得到这样的整个tr还是要从html中找到这样的tr然后取里面的td的值?
      

  2.   


    //str为你的html
                foreach (Match match in Regex.Matches(str, @"<tr.*?onmouseover=""this.bgColor='#FFCCCC'"" onmouseout=""this.bgColor='#FFFF99'""[^>]*>((?><tr[^>]*>(?<o>)|</tr>(?<-o>)|[\s\S])*)(?(o)(?!))</tr>"))
                {
                    Console.WriteLine(match.Value);
                }
      

  3.   

    4楼的接近了,但是onmouseover onmouseout 的属性值可能会变化。我只需要 "onmouseover"  "onmouseout"
      

  4.   


    onmouseover=""this.bgColor='#FFCCCC'"" onmouseout=""this.bgColor='#FFFF99'""this.bgColor='#FFCCCC'   this.bgColor='#FFFF99' 因为颜色肯能会变。但是onmouseover onmouseout这两个关键字肯定有。所以,我想用 "onmouseover"、"onmouseout"做关键字。。
      

  5.   


    @"<tr.*?onmouseover=.*?onmouseout=.*?[^>]*>((?><tr[^>]*>(?<o>)|</tr>(?<-o>)|[\s\S])*)(?(o)(?!))</tr>"
      

  6.   


    我刚才也这样改过,但是不行。CPU占用率100%,程序好像死循环,卡住不动了。
      

  7.   

    这样试试呢:@"<tr.*?onmouseover=""[^""]*""[^>]*onmouseout=""[^""]*""[^>]*>((?><tr[^>]*>(?<o>)|</tr>(?<-o>)|[\s\S])*)(?(o)(?!))</tr>"
      

  8.   


    CPU占用率还是100%。html中这样的行有1000行。
      

  9.   


    @"<tr[^>]*onmouseover=""[^""]*""[^>]*onmouseout=""[^""]*""[^>]*>.*</tr>"
    根据楼主的要求,这个正则可以解决了
      

  10.   

    非常感谢 ojlovecd的指点。多谢!
      

  11.   

    这种需求用正则实现,就一定要用到平衡组了,这没什么好说的
    但是因为数据源比较大,性能成为问题的时候,就要考虑到正则的优化了
    先给出优化后的代码,在我的机器上执行时间平均 340msusing (StreamWriter sw = new StreamWriter(@"G:\正则学习\test.txt", true, Encoding.Default))
    {
        for (int i = 0; i < 1100; i++)
        {
            sw.WriteLine(yourStr);
            sw.WriteLine(DateTime.Now.ToString());
            sw.WriteLine();
        }
    }
    Stopwatch sWatch = new Stopwatch();
    sWatch.Start();
    Regex reg = new Regex(@"<tr(?>(?:(?!onmouseover).)*)onmouseover=""(?>[^""]*)""(?>(?:(?!onmouseout).)*)onmouseout=""(?>[^""]*)""[^>]*>(?>(?:<tr(?>[^>]*)>(?<o>)|</tr>(?<-o>)|(?!</?tr).)*)(?(o)(?!))</tr>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
    string src = string.Empty;
    using (StreamReader sr = new StreamReader(@"G:\正则学习\test.txt", Encoding.Default))
    {
        src = sr.ReadToEnd();
    }
    using (StreamWriter sw = new StreamWriter(@"G:\正则学习\result.txt", true, Encoding.Default))
    {
        MatchCollection mc = reg.Matches(src);
        foreach (Match m in mc)
        {
            sw.WriteLine(m.Value);
        }
    }
    sWatch.Stop();
    richTextBox2.Text += "Done...\n";
    richTextBox2.Text += sWatch.ElapsedMilliseconds.ToString() + " ms";当性能成为不得不考虑的问题的时候,C#中的正则性能优化从几方面考虑:
    1、在频繁调用的方法或是循环中,一定不能用静态方法,而要显式的创建Regex对象
    原因是静态方法会临时创建一个Regex对象,用它来调用请求的方法,然后弃用这个对象。而静态方法每次调用,都必须重新检查正则表达式,所以存在效率缺陷。
    虽然默认情况下,.NET Framework做了缓存处理,但默认只缓存15个正则表达式,尽管可以通过
    Regex.CacheSize = 123;
    来调整,但这并不是解决效率问题的根本方法。
    2、如果正则需要在循环中调用,且循环次数比较多,正则要先在循环体外预编译,RegexOptions.Compiled 。
    3、在数据源较大时,尽量不要使用非贪婪模式
    非贪婪模式(exp)*?以及量词的嵌套使用不当,会造成无限循环回溯,通常是正则效率陷阱的根源,尽量使用排除型字符组[^…]和否定的正向预搜索(?!exp)结合贪婪模式来实现。
    4、匹配失败不需要回溯的子表达式,用固化分组(?>…)加速失败过程,同时避免回溯。
      

  12.   

    过客到楼主另一个帖子里回吧,那个还没结贴呢:
    http://topic.csdn.net/u/20090504/17/03659bbc-60e9-43a0-a4ca-9456d9b22747.html趁你不在的时候偷偷抢了点分
      

  13.   

    多谢 lxcnn 和 ojlovecd 两位指点。lxcnn 说的很精辟。。谢谢!!
      

  14.   


    string strReg = "(?<=<tr bgcolor=\"#FFFF99\" onmouseover=\")(?<A0>.+?)(\" onmouseout=\")(?<A1>.+?)(?=\">)";