使用C#正则表达式解析域名?

7
我需要从一个字符串中解析出域名。字符串可能会有所不同,但我需要完全匹配的域名。
字符串示例:
http://somename.de/
www.somename.de/
somename.de/
somename.de/somesubdirectory
www.somename.de/?pe=12

我需要以下格式的内容,只包含域名、顶级域名和www(如果适用):
www.somename.de

如何使用C#完成这个任务?

嘿,感谢你让它更加清晰明了。 - Umair A.
4个回答

13

作为正则表达式方案的替代,您可以使用 System.Uri 类来解析字符串。您只需要确保该字符串包含一个 scheme。

string uriString = "http://www.google.com/search";

if (!uriString.Contains(Uri.SchemeDelimiter))
{
    uriString = string.Concat(Uri.UriSchemeHttp, Uri.SchemeDelimiter, uriString);
}

string domain = new Uri(uriString).Host;

这个解决方案还会过滤掉任何端口号,并将IPv6地址转换为它的规范形式。


1
你的答案看起来也是有效的。 - Umair A.
@AbdulSaboor,你期望什么?URL包含一个带有空格的主机名(“ blabla”),这使它成为无效的主机名。只有“http://”也是无效的URL。Uri构造函数期望一个有效的URL。 - Niels van der Rest
  1. 如果我去除空格,它就显示为有效的URL。
  2. 我尝试只使用blabla,但它仍显示为有效的URL。我认为这不应该是这样。
- Abdul Saboor

11

我简单使用了它

 Uri uri = new Uri("http://www.google.com/search?q=439489");
            string url = uri.Host.ToString();
            return url;

因为使用这个,你可以确保。


虽然不能确定,但是你的解决方案也接受"h t t p : / / h t t p : / /yee"作为正确的URL(无空格,但是stackoverflow会把双倍的http://改成一个...)。 - Saskia

2
我查看了正则表达式库,并且看起来像这样的东西可能适合你: Regular Expression Library
^(([\w][\w\-\.]*)\.)?([\w][\w\-]+)(\.([\w][\w\.]*))?$

2
@Umair Ashraf - 你应该解释一下它为什么不起作用。你能举一个它无法匹配的行的例子吗? - Kobi
我直接将这行代码放入正则表达式构造函数中,如下(@"^(([\w][\w-.]).)?([\w][\w-]+)(.([\w][\w.]))?$")。 - Umair A.

1

试试这个:

^(?:\w+://)?([^/?]*)

这是一个弱正则表达式 - 它不验证字符串,而是假设它已经是一个URL,并获取第一个单词,直到第一个斜杠,同时忽略协议。要获取域,请查看第一个捕获组,例如:

string url = "http://www.google.com/hello";
Match match = Regex.Match(url, @"^(?:\w+://)?([^/?]*)");
string domain = match.Groups[1].Value;

作为额外的奖励,它还会捕获到第一个?,因此url google.com?hello=world将按预期工作。

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