首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中用正则表达式从字符串中提取域名?

如何在C#中用正则表达式从字符串中提取域名?
EN

Stack Overflow用户
提问于 2021-07-05 19:51:34
回答 3查看 147关注 0票数 1

我想提取顶级域名和国家顶级域名从字符串与正则表达式。我测试了许多如下代码的正则表达式:

代码语言:javascript
复制
var linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
Match m = linkParser.Match(Url);
Console.WriteLine(m.Value);

但是这些代码都不能正确地做到这一点。用户输入的文本字符串可以是以下语句:

代码语言:javascript
复制
jonasjohn.com
http://www.jonasjohn.de/snippets/csharp/
jonasjohn.de
www.jonasjohn.de/snippets/csharp/
http://www.answers.com/article/1194427/8-habits-of-extraordinarily-likeable-people
http://www.apple.com
https://www.cnn.com.au
http://www.downloads.news.com.au
https://ftp.android.co.nz
http://global.news.ca
https://www.apple.com/
https://ftp.android.co.nz/
http://global.news.ca/
https://www.apple.com/
https://johnsmith.eu
ftp://johnsmith.eu
johnsmith.gov.ae
johnsmith.eu
www.jonasjohn.de
www.jonasjohn.ac.ir/snippets/csharp
http://www.jonasjohn.de/
ftp://www.jonasjohn.de/
https://subdomain.abc.def.jonasjohn.de/test.htm

我测试的正则表达式:

代码语言:javascript
复制
^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)"

\b(?:https?://|www\.)\S+\b

://(?<host>([a-z\\d][-a-z\\d]*[a-z\\d]\\.)*[a-z][-a-z\\d]+[a-z])

还有太多,我只需要域名,我不需要一个协议或子域。如: Domainname.gTLD、DomainName.ccTLD或DomainName.xyz.ccTLD

我从PUBLIC SUFFIX上拿到了他们的名单

当然,我在stackoverflow.com上看到了很多帖子,但都没有回应我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-05 21:49:16

根据Lidqy answer的说法,我编写了这个函数,我认为它支持大多数可能的情况,如果输入值不在这个范围内,您可以将其作为一个例外。

代码语言:javascript
复制
public static string ExtractDomainName(string Url)
        {
            var regex = new Regex(@"^((https?|ftp)://)?(www\.)?(?<domain>[^/]+)(/|$)");

            Match match = regex.Match(Url);

            if (match.Success)
            {
                string domain = match.Groups["domain"].Value;
                int freq = domain.Where(x => (x == '.')).Count();
                while (freq > 2)
                {
                    if (freq > 2)
                    {
                        var domainSplited = domain.Split('.', 2);
                        domain = domainSplited[1];
                        freq = domain.Where(x => (x == '.')).Count();
                    }
                }
                return domain;
            }
            else
            {
                return String.Empty;
            }
        }
票数 2
EN

Stack Overflow用户

发布于 2021-07-05 20:13:44

您不需要使用正则表达式来解析URL。如果您有一个有效的URL,您可以使用Uri构造函数或Uri.TryCreate来解析它:

代码语言:javascript
复制
if(Uri.TryCreate("http://google.com/asdfs",UriKind.RelativeOrAbsolute,out var uri))
{
    Console.WriteLine(uri.Host);
}

不过,www.jonasjohn.de/snippets/csharp/jonasjohn.de/snippets/csharp/不是有效的URL。TryCreate仍然可以将它们解析为相对URL,但是读取Host会抛出System.InvalidOperationException: This operation is not supported for a relative URI.

在这种情况下,您可以使用UriBuilder类来解析和修改URL,例如:

代码语言:javascript
复制
var bld=new UriBuilder("jonasjohn.com");
Console.WriteLine(bld.Host);

这是打印

代码语言:javascript
复制
jonasjohn.com

设置Scheme属性会生成一个有效的、完整的URL:

代码语言:javascript
复制
bld.Scheme="https";
Console.WriteLine(bld.Uri);

这会产生以下结果:

代码语言:javascript
复制
https://jonasjohn.com:80/
票数 3
EN

Stack Overflow用户

发布于 2021-07-05 20:09:20

代码语言:javascript
复制
var rx = new Regex(@"^((https?|ftp)://)?(www\.)?(?<domain>[^/]+)(/|$)");
var data = new[] {           "jonasjohn.com",
                             "http://www.jonasjohn.de/snippets/csharp/",
                             "jonasjohn.de",
                             "www.jonasjohn.de/snippets/csharp/",
                             "http://www.answers.com/article/1194427/8-habits-of-extraordinarily-likeable-people",
                             "http://www.apple.com",
                             "https://www.cnn.com.au",
                             "http://www.downloads.news.com.au",
                             "https://ftp.android.co.nz",
                             "http://global.news.ca",
                             "https://www.apple.com/",
                             "https://ftp.android.co.nz/",
                             "http://global.news.ca/",
                             "https://www.apple.com/",
                             "https://johnsmith.eu",
                             "ftp://johnsmith.eu",
                             "johnsmith.gov.ae",
                             "johnsmith.eu",
                             "www.jonasjohn.de",
                             "www.jonasjohn.ac.ir/snippets/csharp",
                             "http://www.jonasjohn.de/",
                             "ftp://www.jonasjohn.de/",
                             "https://subdomain.abc.def.jonasjohn.de/test.htm"
                         };

        foreach (var dat in data) {
            var match = rx.Match(dat);
            if (match.Success)
                Console.WriteLine("{0} => {1}", dat, match.Groups["domain"].Value);
            else {
                Console.WriteLine("{0} => NO MATCH", dat);
            }
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68255680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档