我2天前开始学习REGEX,现在我想创建一个小应用程序来读取网页的源代码并获取http://page.com或http://www.page.com/sub/sub/sub?=value等网页.....这样的东西,无论如何我输入的代码:
Regex r = new Regex("http://\\w");
HttpWebRequest httpwebrequest = (HttpWebRequest)WebRequest.Create("http://maktoob.yahoo.com/?p=us");
HttpWebResponse response = (HttpWebResponse)httpwebrequest.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string line;
while ((line = sr.ReadLine()) != null)
{
Match m = r.Match(line);
if (m.Success)
{
Console.WriteLine("Match: " +m.Value);
}
}
sr.Close();
response.Close();
但结果是:
匹配:http://l 匹配:http://w 匹配:http://x 匹配:http://l 匹配:http://q
它只是获得//之后的第一个字符 当我看着我的模式时,我说lol是的,我的模式是http:// \ w,所以它将获得第一个角色,但我想知道我应该添加到我的模式中,以获得其余的链接? ???
答案 0 :(得分:1)
如果您只需匹配<a>
个元素中的超链接,那么您可以利用封闭引号或双引号来界定您的网址。
Regex regex = new Regex(@"(?<=href=('|""))https?://.*?(?=\1)");
这将匹配以href='…'
或href="…"
开头的http://
或https://
属性中的任何文字。
答案 1 :(得分:0)
这个正则表达式应该做你想要的。请注意,除了HTTP
之外,此正则表达式还支持HTTPShttps?://\\w*
答案 2 :(得分:0)
尝试https?://[^'\"]+
这应该有效,因为链接通常用引号括起来
[edit]甚至更好,只匹配有效字符。 [abc]+
将匹配括号中的每个字符中的一个或多个。查看this答案以获取有效字符列表
答案 3 :(得分:0)
您希望获得多么准确/健壮?到目前为止,我发现的最好的正则表达式之一几乎与所有可能引用它的URL相匹配:
_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS
您可以在此处查看网址验证正则表达式的完整比较表:http://mathiasbynens.be/demo/url-regex
正如道格拉斯所提到的,如果你想匹配链接,而不是任何作为URL模式传递的文本,那么你可以查看锚标签。但是,人们可以将ANYTHING放在锚标记中,例如:<a href="http://junk,.sdf8(_.jf/.klkjl">Junk Link</a>
,因此您仍需要验证URL是否具有正确的架构。