C#.net正则表达式提取网页URL问题

现在利用C#写了一个程序,可以获取网页的源码。但是现在还面临一个问题,就是怎么样快速有效的提取一个网页的源码中所有的<a href="URL"/></a>这样的标记中,所有的URL。
我自己写了一个,效率比较低。想问一下各位有什么好的方法没有。
最好是能用一个效率比较高的方法或者什么能一下子提取出所有的URL
有没有解决方案
我知道正则表达式怎么写。重要是代码怎么实现的部分~在c#中怎么来实现这样的结果~效率高点的方法,一次取出或者循环取出~
给个代码示例吧~

第1个回答  2013-07-10
正则可以提取所有URL的啊。
string web_code;
MatchCollection ms = new Regex("(?<=<a href=\"URL\"/>).*?(</a>)").Matches(web_code);
//个人喜欢用预搜索,你可以改的,用Matches获取所有的URL
然后:
ms[0].Value //第一个URL的值
ms[1].Value //第二个URL的值
按此类推...追问

好像写到c#里面执行不了
我现在想用在一个div标记内所有的URL是这样的格式
text
然后我写的是
Regex("(?)")
求指教~

追答

Regex("(?)")

追问

亲~还是不行昂~我试过了。取出来之后的ms的集合count为0
然后ms[0].value 就不对~异常 ~索引超出范围
因为0处没有数值~

追答

已测试:
Regex("(?)")

点(.)匹配任意字符,(.*?)就是多个任意字符,同样,( *?)就是匹配多个空格。

追问

试过了。。你的这个是可以的。我解决的时候写的是~.+?)\".+?>

本回答被提问者和网友采纳
第2个回答  2013-07-10
/// <summary>
/// 获取符合条件的第一笔数据
/// </summary>
/// <param name="strInfo">需要进行查找的字符串</param>
/// <param name="stMark">开始标识</param>
/// <param name="edMark">结束标识</param>
/// <returns>开始与结束标识之间的内容</returns>
private static string GetFirstString(string strInfo, string stMark, string edMark)
{
int idx = strInfo.IndexOf(stMark);
int stLen = stMark.Length;
int len = strInfo.Length;
if (idx > -1)
{
strInfo = strInfo.Substring(idx + stLen, len - idx - stLen);
int endIdx = strInfo.IndexOf(edMark);
strInfo = strInfo.Substring(0, endIdx);
return strInfo;
}
else
{
return "";
}
}

思路大概这样吧,具体的根据具体来改。。
第3个回答  2013-07-10
  Regex threg = new Regex(@"(?<=<a\s*href="")[^""]*(?="")");
            MatchCollection theMatches = threg.Matches("<a href="URL"/></a>");
            string result = "";
            foreach (Match thematch in theMatches)
            {
                if (thematch.Length!=0)
                {
                    result += thematch.Value.ToString();                    
                }

            }

第4个回答  2013-07-10
性能最高的,肯定是 IndexOf("<a "),然后得到位置后在这个位置之后检索 IndexOf("href=") 然后在用 SubString 取之后的引号内的内容。
第5个回答  2013-07-10
<a.+?href="(?<url>.+?)".+?></a>
提取分组 url追问

我明白 怎么用正则表达式来写~ 重要的是 怎么在c#代码中 取出所有 URL

追答

string pattern = ".+?)\".+?>";
Regex reg = new Regex(pattern);
MatchCollection matches = reg.Matches(网页源代码);
List list = new List();
foreach(Match mat in matches)
{
string result = mat.Group["url"].Value;
list.Add(result);
}

没有在vs里写,手写的,应该是这样的。list里就是全部的url。 知道分组(Group)这个概念就行了 。

追问

这样效率比较高么~?

相似回答