强烈高效正则。。。懂正则的大神速来报道!!!!

vip__888 2011-12-10 02:17:56
<thead>
<tr>
<td class="table-product">商品名称</td>
<td class="table-price">
<a class="orderup" href="javascript:changeSortByIcon(1)" >
商品售价
</a>
</td>
<td class="table-stock">库存</td>
<td class="table-price">
<a class="orderdown" href="javascript:changeSortByIcon(4)" >
商品单价
</a>
</td>
<td class="table-type">保障类型</td>
</tr>
</thead>

<tbody>
<tr>
<td>
<a href="/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao"
class="listicon-guan"
>【点券全】200传奇世界元宝=179.52元</a>
<p>
商品种类:
元宝/点券<br />游戏/区/服:传奇世界/全区/全服
</p></td>
<td><span class="num">179.52</span>元

<a href="
/sales/getCommodityByPointSetp1.htm?commodityId=10978"
class="buy">立即购买</a>
</td>
<td> 1件
</td>
<td><span class="num">0.8976</span>元</td>
<td>
<span class="listicon-shandian" title="当您完成支付,我们将立即为您发货,无需任何等待">闪电发货</span><span class="listicon-guanfang" title="提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑">官方保障</span>
</td>
</tr>
<tr>
<td>
<a href="/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao"
class="listicon-guan"
>【慧慧宝宝】100传奇世界元宝=89.77元</a>
<p>
商品种类:
元宝/点券<br />游戏/区/服:传奇世界/全区/全服
</p></td>
<td><span class="num">89.77</span>元

<a href="
/sales/getCommodityByPointSetp1.htm?commodityId=491145"
class="buy">立即购买</a>
</td>
<td> 39件
</td>
<td><span class="num">0.8977</span>元</td>
<td>
<span class="listicon-shandian" title="当您完成支付,我们将立即为您发货,无需任何等待">闪电发货</span><span class="listicon-guanfang" title="提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑">官方保障</span>
</td>
</tr>


求商品名称,商品售价,库存,商品单价,和最后的一个连接/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao
求高效的 以前发了一个贴 被童鞋们解决了 但是效率实在不理想。。。。所以 求高效。。。

上次帖子的传送门
...全文
242 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
vip__888 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 soonfei 的回复:]

哥们,我给你写一个js的,你看看,顺便测试一下是多少。
HTML code
<head>
<title></title>
<script type="text/javascript">
function gettable() {
//tested 是<tbody>的id
var td1 = "";var td1……
[/Quote]
我的是c#程序 js不适用啊
vip__888 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 q107770540 的回复:]

此处如果有效率要求,貌似用正则不是最优的解决方案
[/Quote]
3楼的方法是不错滴 速度还是很快的
q107770540 2011-12-10
  • 打赏
  • 举报
回复
此处如果有效率要求,貌似用正则不是最优的解决方案
Mr-Jee 2011-12-10
  • 打赏
  • 举报
回复
2楼的童鞋似乎对正则很有兴趣。给个建议,如果是追求效率的话,重点在于减少回溯的次数。
Mr-Jee 2011-12-10
  • 打赏
  • 举报
回复
其实我同意5楼的哥们的方式。
            Regex reg = new Regex(@"<tr>\s*<td>\s*<a\s*href=""(?<url>[^""]+)([^>]+>)(?<name>[^<]+)([^>]+>){7}(?<price>[^<]+)([^>]+>){5}(?<number>[^<]+)([^>]+>){3}(?<single>[^<]+)", RegexOptions.Compiled);
轻狂小疯 2011-12-10
  • 打赏
  • 举报
回复
正则啊 略懂 略懂!!!呵呵 !!
诺维斯基 2011-12-10
  • 打赏
  • 举报
回复
哥们,我给你写一个js的,你看看,顺便测试一下是多少。
<head>
<title></title>
<script type="text/javascript">
function gettable() {
//tested 是<tbody>的id
var td1 = "";var td1text = "";
var td2 = "";var td2text = "";
var td3 = "";
var td4 = "";var td4text = "";
var href = "";
var reg = /<a[^>]+?href=\"(.+?)\"[^>]+?>([^<]+?)<\/a>/;
var reg1=/<span[^>]+?>([^<]+?)<\/span>([^<\s]+)/;
var testTR = document.getElementById("tested").getElementsByTagName("tr");
for (var j = 0; j < testTR.length; j++) {
td1 = testTR[j].children[0].innerHTML;
if (reg.test(td1)) {
href = RegExp.$1;
td1text = RegExp.$2;
}
td2 = testTR[j].children[1].innerHTML;
if (reg1.test(td2)) {
td2text = RegExp.$1 + RegExp.$2;
}
td3 = testTR[j].children[2].innerHTML;
td4 = testTR[j].children[3].innerHTML;
if (reg1.test(td4)) {
td4text = RegExp.$1 + RegExp.$2;
}
document.write(href.toString() + "<br/>" + td1text.toString() + "<br/>" + td2text + "<br/>" + td3 + "<br/>" + td4text + "<br/><br/><br/><br/>");
}
}
</script>
</head>
<body>
<input type="button" id="" onclick="gettable();" value="确定" />
<table>
<thead>
<tr>
<td class="table-product">
商品名称
</td>
<td class="table-price">
<a class="orderup" href="javascript:changeSortByIcon(1)">商品售价 </a>
</td>
<td class="table-stock">
库存
</td>
<td class="table-price">
<a class="orderdown" href="javascript:changeSortByIcon(4)">商品单价 </a>
</td>
<td class="table-type">
保障类型
</td>
</tr>
</thead>
<tbody id="tested">
<tr>
<td>
<a href="/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao"
class="listicon-guan">【点券全】200传奇世界元宝=179.52元</a>
<p>
商品种类: 元宝/点券<br />
游戏/区/服:传奇世界/全区/全服
</p>
</td>
<td>
<span class="num">179.52</span>元 <a href="
/sales/getCommodityByPointSetp1.htm?commodityId=10978" class="buy">
立即购买</a>
</td>
<td>
1件
</td>
<td>
<span class="num">0.8976</span>元
</td>
<td>
<span class="listicon-shandian" title="当您完成支付,我们将立即为您发货,无需任何等待">闪电发货</span><span
class="listicon-guanfang" title="提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑">官方保障</span>
</td>
</tr>
<tr>
<td>
<a href="/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao"
class="listicon-guan">【慧慧宝宝】100传奇世界元宝=89.77元</a>
<p>
商品种类: 元宝/点券<br />
游戏/区/服:传奇世界/全区/全服
</p>
</td>
<td>
<span class="num">89.77</span>元 <a href="
/sales/getCommodityByPointSetp1.htm?commodityId=491145" class="buy">
立即购买</a>
</td>
<td>
39件
</td>
<td>
<span class="num">0.8977</span>元
</td>
<td>
<span class="listicon-shandian" title="当您完成支付,我们将立即为您发货,无需任何等待">闪电发货</span><span
class="listicon-guanfang" title="提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑">官方保障</span>
</td>
</tr>
</tbody>
</table>
</body>
</html>
orain 2011-12-10
  • 打赏
  • 举报
回复
其实 3 楼的是一个挺不错的解决方案,简单清晰。其时间的消耗主要是花费在建立 DOM 上,而不是查找上。
orain 2011-12-10
  • 打赏
  • 举报
回复
一个纯字符串的方案:

private List<string> Match()
{
string html = @"
<thead>
<tr>
<td class=""table-product"">商品名称</td>
<td class=""table-price""> <a class=""orderup"" href=""javascript:changeSortByIcon(1)"" >商品售价</a> </td>
<td class=""table-stock"">库存</td>
<td class=""table-price""> <a class=""orderdown"" href=""javascript:changeSortByIcon(4)"" > 商品单价 </a> </td>
<td class=""table-type"">保障类型</td>
</tr>
</thead>
<tbody>
<tr>
<td> <a href=""/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao"" class=""listicon-guan"" >【点券全】200传奇世界元宝=179.52元</a> <p> 商品种类:元宝/点券<br />游戏/区/服:传奇世界/全区/全服 </p></td>
<td><span class=""num"">179.52</span>元 <a href="" /sales/getCommodityByPointSetp1.htm?commodityId=10978"" class=""buy"">立即购买</a> </td>
<td> 1件 </td>
<td><span class=""num"">0.8976</span>元</td>
<td> <span class=""listicon-shandian"" title=""当您完成支付,我们将立即为您发货,无需任何等待"">闪电发货</span><span class=""listicon-guanfang"" title=""提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑"">官方保障</span> </td>
</tr>
<tr>
<td> <a href=""/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao"" class=""listicon-guan"" >【慧慧宝宝】100传奇世界元宝=89.77元</a> <p> 商品种类:元宝/点券<br />游戏/区/服:传奇世界/全区/全服 </p></td>
<td><span class=""num"">89.77</span>元 <a href="" /sales/getCommodityByPointSetp1.htm?commodityId=491145"" class=""buy"">立即购买</a> </td>
<td> 39件 </td> <td><span class=""num"">0.8977</span>元</td>
<td> <span class=""listicon-shandian"" title=""当您完成支付,我们将立即为您发货,无需任何等待"">闪电发货</span><span class=""listicon-guanfang"" title=""提供盛大游戏的官方自动商品验证及自动充值,免除您的一切顾虑"">官方保障</span> </td>
</tr>
</tbody>
";
int startPos = html.IndexOf("<tbody>") + 7;
int endPos = html.IndexOf("</tbody>", startPos);
List<string> list = new List<string>();
while (startPos < endPos && startPos != -1)
{
startPos = html.IndexOf("<td>", startPos) + 4;
// 链接
startPos = html.IndexOf("href=\"", startPos) + 6;
int end = html.IndexOf("\"", startPos);
list.Add(html.Substring(startPos, end - startPos));

// 品名
startPos = html.IndexOf(">", end) + 1;
end = html.IndexOf("</a>", startPos);
list.Add(html.Substring(startPos, end - startPos));

// 价格
startPos = html.IndexOf("<td>", end) + 4;
startPos = html.IndexOf(">", startPos) + 1;
end = html.IndexOf("<", startPos);
list.Add(html.Substring(startPos, end - startPos));

// 数量
startPos = html.IndexOf("<td>", end) + 4;
end = html.IndexOf("</td>", startPos);
list.Add(html.Substring(startPos, end - startPos).Trim());

// 单价
startPos = html.IndexOf("<td>", end) + 4;
startPos = html.IndexOf(">", startPos) + 1;
end = html.IndexOf("<", startPos);
list.Add(html.Substring(startPos, end - startPos).Trim());

startPos = html.IndexOf("<tr>", end);
}

return list;
}

结果:
循环 10000 次耗时:00:00:00.8750000
/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao
【点券全】200传奇世界元宝=179.52元
179.52
1件
0.8976
/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao
【慧慧宝宝】100传奇世界元宝=89.77元
89.77
39件
0.8977

优点:执行效率高
缺点:对格式适应性差
vip__888 2011-12-10
  • 打赏
  • 举报
回复
5楼的哥们的速度在245毫秒左右 20条数据
继续测试2楼的

2楼的哥们 速度在740毫秒左右 。继续期待大神
orain 2011-12-10
  • 打赏
  • 举报
回复
JQuery 的遍历,绝对比正则的效率高得多,DOM 在内存中本身已经结构化了,JQuery 的遍历大多循环一遍就可以完成,但复杂正则的遍历,想要一遍循环就完成查找是不可能的,它要不停的对字符串做回溯对比,然后才能得到匹配的值,这个效率差可能几十倍到上百倍。
如果查找字符串,真的要高效,最好是自己写算法,即使最笨的挨个比较字符,都比正则效率高。正则的好处是使用方便,在按格式匹配中,能节省大量写代码的时间。
其实楼主这个方案,一个妥协的办法是直接字符串截取到 TBody 的内容,然后用正则提取每一个 Td,然后再提取数据,可能效率会好一些。
vip__888 2011-12-10
  • 打赏
  • 举报
回复
试试就知道了。。都别吵
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 soonfei 的回复:]

像这样的,你还用正则?有js吧。
看那一大陀正则,会高效?
[/Quote]
你有真正测试过它的效率么?即便你用JS也要定位到具体位置的Html标签,像这种没有明确标识的标签,用JS还不一样得去遍历循环?即便用JQUETY选择器,也会逐级去查找和定位。
诺维斯基 2011-12-10
  • 打赏
  • 举报
回复
像这样的,你还用正则?有js吧。
看那一大陀正则,会高效?
dalmeeme 2011-12-10
  • 打赏
  • 举报
回复
怎么回事,我刚才发的3楼到哪去了。再发一遍吧。
我不写正则了,用HtmlAgilityPack:
		HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load(Server.MapPath("~/test.txt"));
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes(@"//tbody//tr");
foreach (HtmlNode node in nodes)
{
Response.Write(node.SelectSingleNode(@"td[1]/a").Attributes["href"].Value + "<br/>");
Response.Write(node.SelectSingleNode(@"td[1]/a").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[2]/span").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[3]").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[4]/span").InnerText + "<br/>");
}

输出:
/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao
【点券全】200传奇世界元宝=179.52元
179.52
1件
0.8976
/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao
【慧慧宝宝】100传奇世界元宝=89.77元
89.77
39件
0.8977
  • 打赏
  • 举报
回复
以上用的是上个帖子的html代码
dalmeeme 2011-12-10
  • 打赏
  • 举报
回复
正则就不写了,估计我写得效率也不会高到哪去。你用HtmlAgilityPack试试:
		HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load(Server.MapPath("~/test.txt"));
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes(@"//tbody//tr");
foreach (HtmlNode node in nodes)
{
Response.Write(node.SelectSingleNode(@"td[1]/a").Attributes["href"].Value + "<br/>");
Response.Write(node.SelectSingleNode(@"td[1]/a").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[2]/span").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[3]").InnerText + "<br/>");
Response.Write(node.SelectSingleNode(@"td[4]/span").InnerText + "<br/>");
}

输出:
/commodity/getCommodity.htm?commodityId=10978&commodityTypeForUIURL=yuanbao
【点券全】200传奇世界元宝=179.52元
179.52
1件
0.8976
/commodity/getCommodity.htm?commodityId=491145&commodityTypeForUIURL=yuanbao
【慧慧宝宝】100传奇世界元宝=89.77元
89.77
39件
0.8977
  • 打赏
  • 举报
回复
 string pattern = @"(?im)(?<=<div[^>]*?table-lists[^>]*?>(?:(?!</?div>)[\s\S])*)<td>\s*<a[^>]+href=(['""])([^'""]+)[^>]+>([^<]+)</a>[\s\S]*?";
pattern += @"<span[^>]+num[^>]*>\s*([^<]+)\s*</span>[\s\S]*?";
pattern += @"<td[^>]*>\s*([^<]+)\s*</td>[\s\S]*?";
pattern += @"<span[^>]+num[^>]*>\s*([^<]+)\s*</span>";
string tempStr = File.ReadAllText(@"C:\Users\dell\Desktop\Test.txt",Encoding.GetEncoding("gb2312"));//读取文档
foreach (Match m in Regex.Matches(tempStr, pattern))
{
//循环输出
string value = m.Value;
string href = m.Groups[2].Value;///commodity/getCommodity.htm?commodityId=555204&commodityTypeForUIURL=yuanbao
string product_name = m.Groups[3].Value;//【乐清人】100热血传奇元宝=104.00元
string sale_price = m.Groups[4].Value;//104.00
string product_num = m.Groups[5].Value;//10件
string single_price = m.Groups[6].Value;//1.0400

}
vip__888 2011-12-10
  • 打赏
  • 举报
回复
TMD 没人?

62,046

社区成员

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

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

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

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