对于端口号测试目的,我传递了以下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}"));
更新
如果我使用System.Uri
,则无论是否包含端口,该值始终为-1。
Uri uri = new Uri(connectionURL);
int value = uri.Port;
答案 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。