Regex IPv4地址的正则表达式,不包括专用IP

Regex IPv4地址的正则表达式,不包括专用IP,regex,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 我发现了同样的问题,但实际上没有人能回答 我一直在使用网站验证正则表达式。我从 \

我需要在一个只支持通过正则表达式进行验证的软件中的一个字段上进行一些数据验证。我一直在寻找我想要的正则表达式,但似乎所有的回答都给出了一个更好的方法。我必须这样做,所以我希望有人能帮助我

基本上,正则表达式应该接受任何有效的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

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

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

\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地址非常有效,但我现在不确定如何排除专用地址。有人对此有正则表达式吗

谢谢。

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

\b(?!(10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|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

当然,假设您引用的软件支持lookarounds。

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

相反,你应该考虑使用符号。 以下是示例范围的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表示法是一种选择。

以防万一, 如果您正在尝试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;
  }

你会想读书的。“一个只支持正则表达式验证的软件”我试着把它输入到那个网站去检查,但是失败了。我知道你想做什么,但我不太明白负面表情应该放在哪里,或者\b部分做什么。
\b
是一个断字。向前看应该紧跟在
\b
之后。我提供了完整的正则表达式,您可以在此处看到它的作用:。如果它不工作,很可能你的软件不支持lookarounds,在这种情况下,你会有一个更艰难的时间。如果你能多解释一下这个神秘的软件可能会有所帮助。如果我们不知道什么风格的正则表达式在起作用,很难知道什么会起作用。@femtoRgon,172.161.1.1被排除在外。排除172.16,但接受172.161或172.16[\d]的正确方法是什么?@techguy2000-应该只能够在前瞻部分之后添加一个
\。
(请参见编辑)谢谢@femtoRgon!我将3[0-2]更改为3[0-1],因为172.32.0.0是公共的: