(正则表达式)"过客"者正则表达式高手来帮忙解决下。。。

wang520d 2007-06-14 01:58:01
需求:1 得到有用的TABLE的TD里面的值 显示成:上市时间@2003你8月@手机制式@CDMA 后面的接着。。


注意:需要解析的字符串不都是有用的TABLE
================解析对象有点厂分几部分贴出================


<!--基本功能--开始-->

<!--基本功能--标题--开始-->
<table width="98%" cellpadding="0" cellspacing="0">
<tr>
<td width="20" height="22" style="padding:2px 0px 0px 0px;">
<img src="/Mobile/Image/icon_circle.gif" width="16" height="16" border="0" /></td>
<td height="22" style="padding:4px 0px 0px 0px;">
<font class='dataTitleBlackFont'>基本功能</font></td>
</tr>
</table>
<table width="99%" cellpadding="0" cellspacing="0">
<tr>
<td width="154" bgcolor="#6DCDFD"><img width="0" height="1" /></td>
<td bgcolor="#cccccc"><img width="0" height="1" /></td>
</tr>
<tr><td colspan="2"><img width="0" height="4" /></td></tr>
</table>
<!--基本功能--标题--结束-->

<!--基本功能--字段--开始-->
<table width='98%' cellpadding='1' cellspacing='0'>
<tr><td class='dataItemTd'>『<a href='/Mobile/Dictionary/1.htm' class='dataDictionaryLink' target='_blank'>CDMA手机</a>』</td><td class='dataItemTd'>『<a href='/Mobile/Dictionary/13.htm' class='dataDictionaryLink' target='_blank'>可选铃声</a>』</td><td class='dataItemTd'>『<a href='/Mobile/Dictionary/16.htm' class='dataDictionaryLink' target='_blank'>图形菜单</a>』</td><td class='dataItemTd'>『<a href='/Mobile/Dictionary/18.htm' class='dataDictionaryLink' target='_blank'>待机图片</a>』</td><td class='dataItemTd'>『<a href='/Mobile/Dictionary/23.htm' class='dataDictionaryLink' target='_blank'>免提通话</a>』</td></tr><tr></tr>
</table>
<!--基本功能--字段--结束-->

<!--基本功能--详细介绍--开始-->
<table width='604' cellpadding='2' cellspacing='0'>
<tr><td colspan="2"><img width="0" height="8" /></td></tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/5.htm' class='dataDictionaryLink' target='_blank'>上市日期</a>:</td>
<td class="dataRight1Td" valign="top">2003年8月</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/6.htm' class='dataDictionaryLink' target='_blank'>手机制式</a>:</td>
<td class="dataRight1Td" valign="top">CDMA</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/7.htm' class='dataDictionaryLink' target='_blank'>支持频段</a>:</td>
<td class="dataRight1Td" valign="top">|CDMA1x-2000|</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/9.htm' class='dataDictionaryLink' target='_blank'>理论通话时间</a>:</td>
<td class="dataRight1Td" valign="top">80-120分钟</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/10.htm' class='dataDictionaryLink' target='_blank'>理论待机时间</a>:</td>
<td class="dataRight1Td" valign="top">60-100小时</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/11.htm' class='dataDictionaryLink' target='_blank'>标准配置</a>:</td>
<td class="dataRight1Td" valign="top">两锂电池(600mAh)、旅行充电器、充电座、外置摄像头、戒指耳机、铝盒、铝制包装箱一个</td>
</tr>

<tr>
<td class="dataLeft1Td" valign="top"><a href='/Mobile/Dictionary/23.htm' class='dataDictionaryLink' target='_blank'>免提通话</a>:</td>
<td class="dataRight1Td" valign="top">支持</td>
</tr>

<tr><td colspan="2"><img width="0" height="8" /></td></tr>
</table>
<!--基本功能--详细介绍--结束-->

<!--基本功能--结束-->

...全文
417 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2007-06-14
  • 打赏
  • 举报
回复
差点忘了说,结果是在list中,而不是最后的strR
-过客- 2007-06-14
  • 打赏
  • 举报
回复
一直都是按你的要求在写,没太注意你要用来做什么,这样改下,直接就可以得到各项的内容,不用你这样取出来后再拆分字符串了,效率上也应该会有提高的,你测下吧,这个属于委托的另类应用了


list = new List<string>();
yourStr = Regex.Replace(yourStr, @"<!--[^>]*(标题|字段)--开始[^>]*-->[\s\S]*?<!--[^>]*\1--结束[^>]*-->", "");
yourStr = yourStr.Replace(" ", "");
string strR = Regex.Replace(yourStr, @"<td[\s\S]*?</td>", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);


List<string> list;
string temp;
private string regReplace(Match m)
{
temp = Regex.Replace(m.Value, @"(<[^>]*>|\s)", "");
if (temp != "")
{
list.Add(temp);
}
return "";
}
wang520d 2007-06-14
  • 打赏
  • 举报
回复
windstore(雪海飄香) ( )
===================

你这样的效率 高吗?
-过客- 2007-06-14
  • 打赏
  • 举报
回复
你测一下吧,这一条语句基本不会造成什么性能损失的,我那样写只是为了照顾通用性
windstore 2007-06-14
  • 打赏
  • 举报
回复
这个是结果:
上市日期:2003年8月
手机制式:CDMA
支持频段:|CDMA1x-2000|
理论通话时间:80-120分钟
理论待机时间:60-100小时
标准配置:两锂电池(600mAh)、旅行充电器、充电座、外置摄像头、戒指耳机、铝盒、铝制包装箱一个
免提通话:支持
外观设计:手表外型
产品天线:外置
机身颜色:亮丽黑、魔幻蓝
产品尺寸:77.5×33.8×17mm
手机重量:95克
可选颜色:亮丽黑、魔幻蓝
屏幕颜色:256色
屏幕类型:STN
输入法:中文输入法;
话机通讯录:支持
通话记录:支持
留言应答:支持
语音拨号:支持
摄像头位置:外置
像素:30万
传感器:CMOS
录音:4分钟录音
日历:支持
计算器:支持
闹钟:支持
备忘录:支持
wang520d 2007-06-14
  • 打赏
  • 举报
回复
你说的是对的,我的网页抓取的时候确实没有抓取这个 ”<!--基本功能--标题--开始-->“
而是从 <Table> 开始的
网页原文件是这样的

<!--基本功能--标题--开始-->
<Table>
</Table>

========这样的话我在前面加上那个SUBSTRING的操作 不会太影响整个解析的完美吧??
strR = htmlStr.Substring(htmlStr.IndexOf("<!--基本功能--详细介绍--开始-->"));
windstore 2007-06-14
  • 打赏
  • 举报
回复
我也来凑凑热闹....

ArrayList arry = new ArrayList(); //存放结果
string str = "你的源代码";
Regex re = new Regex(@"<tr>\s*<td\s+class=\""dataLeft\dTd\""\s+valign=\""top\"">\s*<a\s+href='[^']+'\s*class='dataDictionarylink'[^>]+>(?<var1>[\S\s]+?)</a>:\s*</td>\s*<td\s+class=\""dataRight\dTd\""[^>]+>(?<var2>[\S\s]+?)</td>\s*</tr>", RegexOptions.IgnoreCase);
MatchCollection mc = re.Matches(str);
foreach (Match ma in mc)
{
arry.Add(ma.Groups["var1"].Value +":"+ma.Groups["var2"].Value);
}
foreach (string strs in arry) //输出结果
{
Response.Write(strs + "<br>");
}
-过客- 2007-06-14
  • 打赏
  • 举报
回复
yourStr = Regex.Replace(yourStr, @"<!--[^>]*(标题|字段)--开始[^>]*-->[\s\S]*?<!--[^>]*\1--结束[^>]*-->", "");

这行代码应该把那一部分给去掉了,除非你的源字符串里并不包含
<!--基本功能--标题--开始-->
-过客- 2007-06-14
  • 打赏
  • 举报
回复
不应该的,你上面的这个结果的源码是什么样的,或者是怎么得到的,我看下你对应这个结果的源码,太长就发我邮箱,再提醒我一下

lxcnn@126.com
wang520d 2007-06-14
  • 打赏
  • 举报
回复
加上这句 冒失搞定了。。。
strR = htmlStr.Substring(htmlStr.IndexOf("<!--基本功能--详细介绍--开始-->"));
wang520d 2007-06-14
  • 打赏
  • 举报
回复
=====第一个“基本功能”没有干掉

基本功能÷上市日期:÷2007年÷手机制式:÷GSM÷支持频段:÷|WCDMA||850/900/1800/2100MHz|÷网络连接:÷GPRS;EDGE;÷理论通话时间:÷330分钟÷理论待机时间:÷300小时÷标准配置:÷BL-6P锂电池(830mAh),AC-6诺基亚充电器、诺基亚耳机HS-82、诺基亚micro-USB数据连接线CA-101、CDROM光盘和《用户手册》÷和弦铃声:÷支持÷可选铃声:÷MP3铃声÷内置振动:÷支持÷外观设计:÷直板÷产品天线:÷内置÷机身颜色:÷黑色÷产品尺寸:÷109.8×45×9.5mm÷手机重量:÷94克÷可选颜色:÷黑色÷屏幕颜色:÷彩色屏幕÷屏幕类型:÷TFT÷分辨率:÷240×320pix÷详细说明:÷2.0英寸÷输入法:÷中文输入法;÷EMS短信:÷支持÷多媒体短信:÷支持÷E-Mail:÷支持÷话机通讯录:÷支持÷通讯录群组:÷支持÷通话记录:÷支持÷摄像头位置:÷内置÷像素:÷200万÷传感器:÷CMOS÷变焦模式:÷数码变焦÷视频拍摄:÷有声视频拍摄;并可拍摄QCIF(176×144像素)规格的视频录像÷视频播放:÷兼容MPG-4/H.264/3GP/H.263等格式视频文件及流媒体功能÷WAP浏览器:÷支持÷MP3功能:÷播放包括MP3/AAC/AAC+等格式音乐文件÷内置游戏:÷支持÷内存容量:÷1GB÷Java扩展:÷JavaMIDP2.0÷蓝牙接口:÷支持÷数据线接口:÷micro-USB÷录音:÷支持÷日历:÷支持÷计算器:÷支持÷闹钟:÷支持
-过客- 2007-06-14
  • 打赏
  • 举报
回复
如果上面的结果是你想要的,再这样优化一下

yourStr = Regex.Replace(yourStr, @"<!--[^>]*(标题|字段)--开始[^>]*-->[\s\S]*?<!--[^>]*\1--结束[^>]*-->", "");
yourStr = yourStr.Replace(" ", "");
string strR = Regex.Replace(yourStr, @"<td[\s\S]*?</td>", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);
strR = Regex.Replace(strR, @"<[^>]*>", "");
strR = Regex.Replace(strR, @"\s+", "");
strR = Regex.Replace(strR, @"÷+", "÷");
strR = strR.Trim();
strR = strR.TrimStart('÷');
strR = strR.TrimEnd('÷');

private string regReplace(Match m)
{
return "÷" + Regex.Replace(m.Value, @"<[^>]*>", "") + "÷";
}
windstore 2007-06-14
  • 打赏
  • 举报
回复
乖乖,这么长...
wang520d 2007-06-14
  • 打赏
  • 举报
回复
先试下。。
-过客- 2007-06-14
  • 打赏
  • 举报
回复
这样试下

yourStr = Regex.Replace(yourStr, @"<!--[^>]*标题--开始[^>]*-->[\s\S]*?<!--[^>]*标题--结束[^>]*-->", "");
yourStr = yourStr.Replace(" ", "");
string strR = Regex.Replace(yourStr, @"<td[\s\S]*?</td>", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);
strR = Regex.Replace(strR, @"<[^>]*>", "");
strR = Regex.Replace(strR, @"『[^』]*』", "");
strR = Regex.Replace(strR, @"\s+", "");
strR = Regex.Replace(strR, @"÷+", "÷");
strR = strR.Trim();
strR = strR.TrimStart('÷');
strR = strR.TrimEnd('÷');

private string regReplace(Match m)
{
return "÷" + Regex.Replace(m.Value, @"<[^>]*>", "") + "÷";
}

输出:
上市日期:÷2003年8月÷手机制式:÷CDMA÷支持频段:÷|CDMA1x-2000|÷理论通话时间:÷80-120分钟÷理论待机时间:÷60-100小时÷标准配置:÷两锂电池(600mAh)、旅行充电器、充电座、外置摄像头、戒指耳机、铝盒、铝制包装箱一个÷免提通话:÷支持÷外观设计:÷手表外型÷产品天线:÷外置÷机身颜色:÷亮丽黑、魔幻蓝÷产品尺寸:÷77.5×33.8×17mm÷手机重量:÷95克÷可选颜色:÷亮丽黑、魔幻蓝÷屏幕颜色:÷256色÷屏幕类型:÷STN÷详细说明:÷永不磨损的高科技水晶屏幕÷输入法:÷中文输入法;÷话机通讯录:÷支持÷通话记录:÷支持÷留言应答:÷支持÷语音拨号:÷支持÷摄像头位置:÷外置÷像素:÷30万÷传感器:÷CMOS÷录音:÷4分钟录音÷日历:÷支持÷计算器:÷支持÷闹钟:÷支持÷备忘录:÷支持
wang520d 2007-06-14
  • 打赏
  • 举报
回复
每个有用的表格前面都有一个这样的表格。。是说明下面的参数是说明的。。这个我想过滤。。
wang520d 2007-06-14
  • 打赏
  • 举报
回复
还有一个地方没有考虑到
“头、戒指耳机、铝盒、铝制包装箱一个÷免提通话:÷支持÷外观设计÷外观设计:÷手表外型÷产品天” 连着有两个“外观设计”
这样的没有过滤 这个TABLE其实是没用的
后面还有向你 SUBSTRING 之前那样的表格 怎么办呢? 如下面的,这个表格就是无用的
难道在你的结果里面用 Replace 吗 还是说正则里面有更好的办法???
<!--外观设计--标题--开始-->
<table width="98%" cellpadding="0" cellspacing="0">
<tr>
<td width="20" height="22" style="padding:2px 0px 0px 0px;">
<img src="/Mobile/Image/icon_circle.gif" width="16" height="16" border="0" /></td>
<td height="22" style="padding:4px 0px 0px 0px;">
<font class='dataTitleBlackFont'>外观设计</font></td>
</tr>
</table>
<table width="99%" cellpadding="0" cellspacing="0">
<tr>
<td width="154" bgcolor="#6DCDFD"><img width="0" height="1" /></td>
<td bgcolor="#cccccc"><img width="0" height="1" /></td>
</tr>
<tr><td colspan="2"><img width="0" height="4" /></td></tr>
</table>
<!--外观设计--标题--结束-->
wang520d 2007-06-14
  • 打赏
  • 举报
回复
速度还真快 已经出来拉 我再看看。。
firsk 2007-06-14
  • 打赏
  • 举报
回复
学习
wang520d 2007-06-14
  • 打赏
  • 举报
回复
====结果是这样就完全OK========

上市日期÷2003年8月÷
手机制式÷CDMA÷
支持频段÷|CDMA1x-2000|÷
理论通话时间÷80-120分钟÷
理论待机时间÷60-100小时÷
标准配置÷两锂电池(600mAh)、旅行充电器、充电座、外置摄像头、戒指耳机、铝盒、铝制包装箱一个÷
免提通话÷支持÷
外观设计÷手表外型÷
产品天线÷外置÷
机身颜色÷亮丽黑、魔幻蓝÷
产品尺寸÷77.5×33.8×17mm÷
手机重量÷95克÷
可选颜色÷亮丽黑、魔幻蓝÷
屏幕颜色÷256色÷
屏幕类型÷STN÷
详细说明÷永不磨损的高科技水晶屏幕÷
输入法÷中文输入法÷
话机通讯录÷支持÷
通话记录÷支持÷
留言应答÷支持÷
语音拨号÷支持÷
摄像头位置÷外置÷
像素÷30万÷
传感器÷CMOS÷
日历÷支持÷
计算器÷支持÷
闹钟÷支持÷
备忘录÷支持
加载更多回复(21)

62,046

社区成员

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

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

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

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