【问题标题】:Using a C# regex to parse a domain name?使用 C# 正则表达式解析域名?
【发布时间】:2010-07-24 13:44:22
【问题描述】:

我需要从字符串中解析域名。字符串可以变化,我需要确切的域。

字符串示例:

http://somename.de/
www.somename.de/
somename.de/
somename.de/somesubdirectory
www.somename.de/?pe=12

我需要以下格式,仅包含域名、tldwww(如果适用):

www.somename.de

如何使用 C# 做到这一点?

【问题讨论】:

  • 嘿,谢谢你让它更清楚

标签: c# .net regex


【解决方案1】:

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

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 地址转换为其规范形式。

【讨论】:

  • 你的答案看起来也有效。
  • @AbdulSaboor,你会期待什么? URL 包含一个带有空格的主机名(“blabla”),这使其成为无效的主机名。只是“http://”也是一个无效的 URL。 Uri 构造函数需要一个有效的 URL。
  • 1.如果我删除空格,它会显示有效的 url。 2. 我只尝试了 blabla,但它仍然说它是有效的 url。我认为不应该。
【解决方案2】:

我用的很简单

 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:// 更改为一个……
【解决方案3】:

我查看了Regular Expression Library,看起来像这样的东西可能适合你:

^(([\w][\w\-\.]*)\.)?([\w][\w\-]+)(\.([\w][\w\.]*))?$

【讨论】:

  • @Umair Ashraf - 你应该解释一下它是如何不起作用的。你能举一个不匹配的行的例子吗?
  • 我直接把这条线放在 Regex 构造函数中,比如 (@"^(([\w][\w\-\.]*)\.)?([\w][\w\ -]+)(\.([\w][\w\.]*))?$")
【解决方案4】:

试试这个:

^(?:\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 将按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2018-02-06
    相关资源
    最近更新 更多