0

我发现了这个正则表达式:

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

它应该匹配任何主机名,但是我还需要它匹配一个冒号,最后是一个端口号,如下所示:

host.name.com:8888

我怎样才能修改这个表达式来做我需要的?

4

3 回答 3

1

不要使用正则表达式,使用TcpClient

static bool checkHost(string host,int timeout)
{
    if (!host.Contains(':')) 
        return false;
    try
    {
        string[] h = host.Split(':');
        Task e = new TcpClient().ConnectAsync(h[0], int.Parse(h[1]));
        new Task(e.Start);
        Thread.Sleep(timeout);

        return e.IsCompleted;
    }
    catch (SocketException){ }
    catch (ArgumentOutOfRangeException) { }

    return false;
}

例子

bool check = checkHost("google.com:80",1000);
于 2013-10-25T23:06:24.980 回答
0

您可以简单地将结尾从 $ 更改为 (?::[\d]+)?$ 您可以使用在线 reg exp 匹配器或QuickREx轻松测试这些东西,这是我更喜欢的工具。

于 2013-10-25T22:08:05.827 回答
0

这是我为我的 C# 应用程序设计的 RegEx:

@"^(?<hostname>((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?)|localhost)(?::(?<port>\d+))$"
于 2013-10-28T16:42:25.413 回答