IPv4地址的正则表达式,不包括私有IP

时间:2015-03-25 22:34:25

标签: regex

我需要在一个软件中的字段上进行一些数据验证,该软件仅支持通过正则表达式进行验证。我一直在寻找正在寻找的正则表达式,但似乎所有的响应只是提供了一个更好的方法来做到这一点。我必须这样做,所以我希望有人可以帮助我。

基本上,正则表达式应该接受任何有效的IPv4地址,不包括以下内容:

从10.0.0.0到10.255.255.255

从172.16.0.0到172.31.255.255

从192.168.0.0到192.168.255.255

我发现了同样的问题here,但实际上没有人能够回答它。

我一直在使用this网站来尝试验证正则表达式。我从

开始
\b(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))\b

我也在网站上找到了。这适用于IPv4地址,但我现在不确定如何排除私有地址。有没有人有这方面的正则表达式?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以在前面添加negative lookahead检查它们((?!(10|172\.(1[6-9]|2[0-9]|3[0-2])|192\.168))),为您提供:

\b(?!(10|172\.(1[6-9]|2[0-9]|3[0-2])|192\.168))(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))\b

假设您所指的软件支持外观,当然。

答案 1 :(得分:0)

以防万一, 如果您正在尝试 IP,CIDR 验证(例如:10.123.33.12/32)。试试下面的:

  validateCIDRAddress(data: string) {
    let isValid = false;
    const regexp = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/;
    if (data && regexp.test(data)) {
      isValid = true;
    }
    return isValid;
  }

答案 2 :(得分:-2)

正则表达式不是指定IPv4地址范围的最佳方法。随着您添加越来越多的范围,您的正则表达式将变得越来越复杂且容易出错。

相反,您应该考虑使用CIDR表示法。

以下是您的示例范围的CIDR表示法:

From 10.0.0.0 to 10.255.255.255 -> 10.0.0.0/8
From 172.16.0.0 to 172.31.255.255 -> 172.16.0.0/12
From 192.168.0.0 to 192.168.255.255 -> 192.168.0.0/16

您的编程语言可能有一个库,可以让您轻松确定给定的输入IPv4地址是否对给定的CIDR地址列表有效。

编辑:

我没注意到OP显然使用的某种软件无法使用regexp以外的任何技术来验证IP地址是否在范围内。所以,如果确实如此,那么显然我使用CIDR表示法的替代方案对于这种特殊情况不起作用。但是,我坚持认为使用CIDR表示法编码IP地址范围通常是比使用正则表达式更好的选择,当CIDR表示法是一个选项时。