CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

一个关于正则表达式的问题

楼主shine64(鱼)2006-03-04 02:35:19 在 .NET技术 / C# 提问

我用正则表达式获取一个html页面中的所有链接,表达式这样"<a(.*)</a>",可是取出的结果集,多数正确,个别有问题,结果如下:  
   
  正确的  
  <a   href=http://www.sina.com.cn/>首页</a>  
  <a   href=http://news.sina.com.cn/>新闻</a>  
  <a   href=http://finance.sina.com.cn/>财经</a>  
   
  有问题的  
  <a   href=http://blog.sina.com.cn/lm/hot/index.html   target=_blank>最热博客</a>   <a   href=http://blog.sina.com.cn/lm/html/2006-01-28/306.html   target=_blank>百万博客榜</a>  
   
  <a   href=http://bf.sina.com.cn/sinarc_php/piclist.php?aid=113&from=464>图</a><a   href=http://bf.sina.com.cn/sinarc_php/ringlist.php?aid=82&from=464>铃</a>  
   
   
  为什么明明有</a>却没有匹配?  
   
   
  源码如下:  
   
  private   string   Html2Table(htmlstr)  
                  {  
                           
                          Regex   re   =   new   Regex("<a(.*)</a>");  
                          MatchCollection   matches   =   re.Matches(htmlstr);  
   
                          string   bbb   =   "";  
   
                          Regex   re2   =   new   Regex("<a(.*)>");  
   
                          foreach   (Match   item   in   matches)  
                          {  
                                  bbb   =   bbb   +   item.Value   +   "\r\n";  
                          }  
                          return   bbb;  
                  }  
   
   
  请教各位,不胜感激! 问题点数:100、回复次数:6Top

1 楼cncxz(c: (虫虫)回复于 2006-03-04 02:41:28 得分 10

Regex   re   =   new   Regex("<a(.*)</a>",   RegexOptions.Compiled);Top

2 楼saucer(思归)回复于 2006-03-04 02:42:50 得分 20

try    
   
  .*?  
   
  or  
   
                    string   s   =   "........";  
   
  Regex   re   =   new   Regex(@"<a[^>]*href=(""(?<link>[^""]*?)""|'(?<link>[^']*?)'|(?<link>[^\s>]*))",   RegexOptions.IgnoreCase|RegexOptions.Singleline);  
  foreach(Match   m   in   re.Matches(s))  
  {  
  Console.WriteLine(m.Groups["link"].Value);  
  }Top

3 楼fancyf(凡瑞)回复于 2006-03-04 03:12:53 得分 70

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=209955  
  用一句正则表达式匹配出网上所有链接Top

4 楼shine64(鱼)回复于 2006-03-04 12:18:20 得分 0

问题解决了,最后用的fancyf的方法,谢谢几位帮忙。Top

5 楼shine64(鱼)回复于 2006-03-04 12:20:00 得分 0

哪位能不能解释一下为什么我那样写不对?Top

6 楼fancyf(凡瑞)回复于 2006-03-05 03:39:19 得分 0

<a(.*)</a>中的.*是贪婪的匹配,它匹配尽量多的字符  
  如果一行仅有一个<a...</a>的话,他能够匹配这一对标签  
  如果一行中有多于一个的<a...</a><a...</a>的话,<a(.*)</a>中的“<a”将匹配第一个出现的<a,而</a>将匹配最后一个出现的</a>,从而将多个链接当成了一个,出现错误  
  简单的修改是<a(.*?)</a>,将贪婪匹配改为非贪婪匹配,(.*?)中将包含尽可能少的字符  
  .不包括换行符,因此  
  更好一点的表达式应该是<a([\s\S]*?)</a>,它能处理标签中间有换行的链接  
  我的那个正则表达式考虑了更复杂的情况,而且分析出了其中的属性,不需要的话可以修改Top

相关问题

  • 正则表达式
  • 正则表达式
  • 正则表达式?
  • 正则表达式[/.-]
  • 【正则表达式!!!!!!!!】
  • 正则表达式
  • 正则表达式
  • 正则表达式
  • 正则表达式?
  • 正则表达式

关键词

  • 正则表达式
  • 匹配
  • regex
  • bbb
  • regexoptions
  • matches
  • 问题
  • re
  • 链接
  • 话

得分解答快速导航

  • 帖主:shine64
  • cncxz
  • saucer
  • fancyf

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo