一个关于正则表达式的问题
我用正则表达式获取一个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




