端口号检索

时间:2017-07-10 20:33:24

标签: c#

对于端口号测试目的,我传递了以下URL,但它抛出异常,异常本身为null - 没有描述性信息

testURL = "ce-34-54-33.compute-1.amazonaws.com:";

Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?:(?<port>\d+)?/",
RegexOptions.None, TimeSpan.FromMilliseconds(150));
// the following throws an exception
int port = Int32.Parse(r.Match(testURL).Result("${port}"));

enter image description here

enter image description here

更新

如果我使用System.Uri,则无论是否包含端口,该值始终为-1。

Uri uri = new Uri(connectionURL);
int value = uri.Port;

1 个答案:

答案 0 :(得分:2)

你得到的例外是:

  

System.NotSupportedException:&#39;在失败的匹配项上无法调用结果。&#39;

您的testURL不包含端口,因此命名组&#34;端口&#34;没有匹配任何东西。它也没有包含&#34; proto&#34;,它没有被标记为可选,因此整个正则表达式没有匹配。最后,它并没有以所需的斜线结束。

所以修改你的输入:

var testURL = "https://ce-34-54-33.compute-1.amazonaws.com:443/";

Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?:(?<port>\d+)?/");

var port = int.Parse(r.Match(testURL).Result("${port}"));

你会发现它运作得很好。

当然这段代码仍然需要额外的错误处理:

var testURL = "https://ce-34-54-33.compute-1.amazonaws.com:443/";

Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?:(?<port>\d+)?/");

var match = r.Match(testURL);

var portGroup = match.Groups["port"];
int port = -1;

if (portGroup.Success)
{
    if (!int.TryParse(portGroup.Value, out port))
    {
        port = -1;
    }
}

如果输入URL中没有端口,则将端口设置为-1。