正则表达式验证指定为IP v4地址或主机名的字符串,带或不带端口号

时间:2016-02-26 14:37:14

标签: c# regex url

我正在开发一个需要验证用户输入的URL字符串的应用程序。用户从组合框中选择协议(HTTPS,TCP或UDP)。如果他们从组合框中选择TCP或UDP,则为URL字符串:

  • 必须输入为IPv4地址或主机名
  • 必须包含有效的端口号(1 - 65535)
  • 对于IPv4地址,每个八位字节必须有效(0到255之间)

如果用户从组合框中选择HTTPS,则为URL字符串:

  • 必须输入为IPv4地址或主机名
  • 可能包含路径
  • 可能包含有效的端口号(1 - 65535)
  • 对于IPv4地址,每个八位字节必须有效(0到255之间)

我已经尝试构建一些正则表达式来完成上述URL字符串的验证,但不幸的是,我似乎有些不对劲。我远不是正则表达的专家,而且我已经看了很长时间了,我想我需要一些比我更聪明的人的帮助。 : - )

以下是一些应该有效的示例字符串:

For TCP/UDP:
10.1.1.100:12345
mydomain.fr:31337

For HTTPS:
192.168.0.1
192.168.0.1/testdir
192.168.0.1:12345/testdir
192.168.0.1:12345/testdir/testdir_2
mydomain.fr
www.mydomain.fr
www.mydomain.fr/testdir
www.mydomain.fr:12345/testdir
www.mydomain.fr:12345/testdir/testdir_2

以下是我尝试用来验证URL字符串的两个C#方法:

public static bool IsValidHttpsUrl(string url)
{
    const string Pattern = @"^(([a-z0-9-]+\\.)+[a-z]{2,6}|((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]))(:(6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3}))?(/[\\w/.]*)?$";

    var regex = new System.Text.RegularExpressions.Regex(Pattern, System.Text.RegularExpressions.RegexOptions.Compiled);
    return regex.Match(url).Success;
}

public static bool IsValidTcpOrUdpUrl(string url)
{
    const string Pattern = @"^(([a-z0-9-]+\\.)+[a-z]{2,6}|((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])):(6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3})$";

    var regex = new System.Text.RegularExpressions.Regex(Pattern, System.Text.RegularExpressions.RegexOptions.Compiled);
    return regex.Match(url).Success;
}

任何人都可以了解我出错的地方吗?

1 个答案:

答案 0 :(得分:3)

您只需要使用常规字符串文字进行正则表达式声明(删除@),或使用单个反斜杠。

const string Pattern = @"^(([a-z0-9-]+\.)+[a-z]{2,6}|((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]))(:(6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}))?(/[\w/.]*)?$";

const string Pattern = @"^(([a-z0-9-]+\.)+[a-z]{2,6}|((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])):(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})$";