【问题标题】:C# Regex bug with URL带有 URL 的 C# 正则表达式错误
【发布时间】:2013-10-27 17:07:10
【问题描述】:

我正在解析一个 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。如何检查可变部分,例如“如果有斜线,请停止第一个或抓住一切”。

【问题讨论】:

    标签: c# regex parsing url


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      只是另一种选择

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

      【讨论】:

        【解决方案3】:

        你应该使用Uri 类是正确的,但如果你坚持使用Regex,请尝试使用这样的零宽度肯定前瞻断言:

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

        更多详情请访问:

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

        【讨论】:

        • Uri 类不起作用。这些不是有效的 Uris。生成“System.UriFormatException:无效的 URI:无法确定 URI 的格式。”
        • 正则表达式也不起作用。仍然为第 1 组生成 http:,为第 2 组生成 //careers.stackoverflow.com
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        • 2015-07-10
        • 2016-07-30
        • 2016-02-05
        • 1970-01-01
        相关资源
        最近更新 更多