带URL的C#Regex bug

时间:2013-10-27 17:07:10

标签: c# regex parsing url

我正在解析一个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

输出中的每个网址都有效:http://careers.stackoverflow.com。我如何检查变量部分,如“如果有斜线,停止第一个抓住每一个东西”。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只是另一种选择

/(?:.+\/\/|\/\/)?([^\/]*)(\/.+)?/

答案 2 :(得分:-1)

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

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

更多详情:

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