如何在C#中匹配URL?

11

我找到了很多关于如何在PHP和其他语言中匹配特定类型的URL的例子。我需要从我的C#应用程序中匹配任何URL。如何操作?当我谈论URL时,我指的是链接到任何站点或站点和子目录上的文件的链接。

我有这样的文本:"前往我的超赞网站http:\www.google.pl\something\blah\?lang=5"或其他内容,我需要从这条消息中获取此链接。链接也只能以www开头。


你可能想使用正斜杠,因为如果你混淆了Microsoft\Windows Land和Unix/WWW Land,你将永远无法匹配带有反斜杠的URL。 - Jared Updike
8个回答

21
如果你需要测试你的正则表达式以查找URL,可以尝试使用这个工具:http://gskinner.com/RegExr/。它可以在你编写正则表达式时对其进行测试。在C#中,你可以使用正则表达式,如下所示:
Regex r = new Regex(@"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*");
// Match the regular expression pattern against a text string.
Match m = r.Match(text);
while (m.Success) 
{
   //do things with your matching text 
   m = m.NextMatch();
}

2
+1:虽然你忘记在字符串前面加上@符号。 - Patrick Klug
@Rumplin:你能解释一下你遇到的错误吗?如果我用gskinner尝试,正则表达式会正确匹配http://www.test.com/,或者你是想要整个字符串与''匹配? - michele
你必须查看实际的URL,而不是显示的URL。Stackoverflow会纠正链接中的“http:// http://”问题,其中没有空格。 - Rumplin

18

6
那个不包括 URL 后面的查询字符串,它会在第一个 '=' 字符处停止。要修复这个问题,只需要添加一个等号 '=',使其以这样的方式结束 "....&%$#_=]*)?$"。此外,该正则表达式模式将无法在字符串中找到 URL。它只能告诉你该字符串是否为 URL。如果要查找 URL,请省略开头的 "^" 和结尾的 "$"。Regex.Matches(text, pattern) 应该会返回文本中的所有 URL。 - Wolf5
它是否包含mailto网址? - user

5

我不确定您的具体问题,但一个好的起点是使用Uri类,该类可以帮助您解析URL。


1
这可以更具体一些:例如:var myUri = null; Uri.TryCreate(str, UriKind.Absolute, out myVar); 并检查myUri是否从null变为非null。 - Jared Updike

5

1
Regex regx = new Regex("http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase); 

0

这将返回一个匹配集合,其中包含在“yourStringThatHasUrlsInIt”中找到的所有匹配项:

var pattern = @"((ht|f)tp(s?)\:\/\/|~/|/)?([w]{2}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?";
var regex = new Regex(pattern);
var matches = regex.Matches(yourStringThatHasUrlsInIt);

返回值将是一个“MatchCollection”,您可以在此处了解更多信息:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchcollection.aspx


0

您也可以使用https://github.com/d-kistanov-parc/DotNetUrlPatternMatching

该库允许您将URL与模式匹配。

它的工作原理:

  • 将URL模式分成几个部分
  • 每个非空部分都与URL中类似的部分进行匹配。

您可以指定通配符*或~ 其中*是组内的任何字符集(方案、主机、端口、路径、参数、片段) 其中~是组段内的任何字符集(主机、路径)

只提供您关心的URL部分。留下的部分将匹配任何内容。例如,如果您不关心主机,则将其留空。


0
          //This code return (protocol://)host:port from URL

          //Commented URL's with different protocols. Just uncomment to test.
          //string url = "http://www.contoso.com:8080/letters/readme.html";
          //string url = "ftp://www.contoso.com:8080/letters/readme.html";
          //string url = "l2tp://1.5.8.6:8080/letters/readme.html";
          string url = "l2tp://1.5.8.6:8080/letters/readme.html";

          string host = "";//empty string with host from url
                //protocol, (ip/domain), port
          host = Regex.Match(url, @"^(?<proto>\w+)://+?(?<host>[A-Za-z0-9\-\.]+)+?(?<port>:\d+)?/", RegexOptions.None, TimeSpan.FromMilliseconds(150)).Result("${proto}://${host}${port}");
                //(ip/domain):port without protocol. If HTTPS board loading images from HTTP host.
          //host = Regex.Match(url, @"^(?<proto>\w+)://+?(?<host>[A-Za-z0-9\-\.]+)+?(?<port>:\d+)?/", RegexOptions.None, TimeSpan.FromMilliseconds(150)).Result("${host}${port}");

          Console.WriteLine("url: "+url+"\nhost: "+host); //display host

请查看https://rextester.com/PVSO54371


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接