3

我正在解析一个 URL 文件以获取主机和 URI 部分,但是当 URL 没有以斜杠结尾时会出现错误。

C#代码:

var URL = Regex.Match(link, @"(?:.*?//)?(.*?)(/.*)", RegexOptions.IgnoreCase);

输入 :

//cdn.sstatic.net/stackoverflow/img/favicon.ico
/opensearch.xml
http://stackoverflow.com/
http://careers.stackoverflow.com

输出 :

//cdn.sstatic.net/stackoverflow/img/favicon.ico has 2 groups:
    cdn.sstatic.net
    /stackoverflow/img/favicon.ico

/opensearch.xml has 2 groups:

    /opensearch.xml

http://stackoverflow.com/ has 2 groups:
    stackoverflow.com
    /
http://careers.stackoverflow.com has 2 groups:
    http:
    //careers.stackoverflow.com

输出中的每个 URL 都是有效的,例如:http ://careers.stackoverflow.com 。我如何检查可变部分,例如“如果有斜线,请停止第一个或抓住一切”。

4

3 回答 3

1

添加|$到最后一个组,以匹配该文本或匹配表达式的结尾。

这适用于您的输入:

var links = new[]
    {
        "//cdn.sstatic.net/stackoverflow/img/favicon.ico",
        "/opensearch.xml",
        "http://stackoverflow.com/",
        "http://careers.stackoverflow.com"
    };

foreach (string link in links)
{
    var u = Regex.Match(link, @"(?:.*?//)?(.*?)(/.*|$)", RegexOptions.IgnoreCase);
    Console.WriteLine(link);
    Console.WriteLine("    " + u.Groups[1]);
    Console.WriteLine("    " + u.Groups[2]);
    Console.WriteLine();
}

输出:

//cdn.sstatic.net/stackoverflow/img/favicon.ico
    cdn.sstatic.net
    /stackoverflow/img/favicon.ico

/opensearch.xml

    /opensearch.xml

http://stackoverflow.com/
    stackoverflow.com
    /

http://careers.stackoverflow.com
    careers.stackoverflow.com
于 2013-10-27T17:20:18.997 回答
1

只是另一种选择

/(?:.+\/\/|\/\/)?([^\/]*)(\/.+)?/
于 2013-10-27T17:52:55.420 回答
-1

usr 是正确的,您应该使用Uri该类,但如果您坚持使用Regex,请尝试使用零宽度正向前瞻性断言,如下所示:

var URL = Regex.Match(link, @"(?:.*?//)?(.*?(?=/|$))(/.*)", RegexOptions.IgnoreCase);

更多详情请访问:

http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#zerowidth_positive_lookahead_assertion

于 2013-10-27T17:16:36.867 回答