求一个正则表达式,能够从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>
可以用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>
解决方案 »
- 高分求救,winform和web之间通信
- varbinary类型
- 好奇怪!!菜鸟问题。
- 在dataGridView中把记录修改完成后,如何将dataGridView中的纪录显示在一个新建的没有数据的datatable中呢?为什么下面的方法不行呢:
- Dataset 的问题
- vs.net平台,使用c#调用borland c++6.0开发com组件
- 各位大哥我怎么判断查询
- VS2012出问题了 一创建新项目就弹出 ”未找到与约束“
- 程序生成出错过后,即使代码已经正确也会出错,以下提示:未能写入输出文件“路径\程序.exe”--“拒绝访问。 ”
- c#中的加密算法encrypt
- c# winform ZedGraph 鼠标悬停到节点提示信息问题!!
- wpf的treeview的问题
//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);
}
onmouseover=""this.bgColor='#FFCCCC'"" onmouseout=""this.bgColor='#FFFF99'""this.bgColor='#FFCCCC' this.bgColor='#FFFF99' 因为颜色肯能会变。但是onmouseover onmouseout这两个关键字肯定有。所以,我想用 "onmouseover"、"onmouseout"做关键字。。
@"<tr.*?onmouseover=.*?onmouseout=.*?[^>]*>((?><tr[^>]*>(?<o>)|</tr>(?<-o>)|[\s\S])*)(?(o)(?!))</tr>"
我刚才也这样改过,但是不行。CPU占用率100%,程序好像死循环,卡住不动了。
CPU占用率还是100%。html中这样的行有1000行。
@"<tr[^>]*onmouseover=""[^""]*""[^>]*onmouseout=""[^""]*""[^>]*>.*</tr>"
根据楼主的要求,这个正则可以解决了
但是因为数据源比较大,性能成为问题的时候,就要考虑到正则的优化了
先给出优化后的代码,在我的机器上执行时间平均 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、匹配失败不需要回溯的子表达式,用固化分组(?>…)加速失败过程,同时避免回溯。
http://topic.csdn.net/u/20090504/17/03659bbc-60e9-43a0-a4ca-9456d9b22747.html趁你不在的时候偷偷抢了点分
string strReg = "(?<=<tr bgcolor=\"#FFFF99\" onmouseover=\")(?<A0>.+?)(\" onmouseout=\")(?<A1>.+?)(?=\">)";