【问题标题】:Regex for IPv4 address, excluding private IPsIPv4 地址的正则表达式,不包括私有 IP
【发布时间】:2021-04-15 18:40:02
【问题描述】:

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

基本上,正则表达式应该接受任何有效的 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 地址,但我现在不确定如何排除私有地址。有人有这方面的正则表达式吗?

谢谢。

【问题讨论】:

标签: regex


【解决方案1】:

您可以在前面添加一个negative lookahead 检查它们 ((?!(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

当然,假设您所指的软件支持环视。

【讨论】:

  • 我尝试将其输入到该网站进行检查,但它失败了。我知道您要做什么,但我不完全明白在哪里放置负前瞻或 \b 部分的作用。
  • \b 是一个分词。前瞻应该紧跟在\b 之后。我提供了完整的正则表达式,你可以在这里看到它的实际效果:regexr.com/3amgm。如果它不起作用,那么您的软件很可能不支持环视,在这种情况下,您将面临更艰难的时期。如果您对这个神秘软件进行更多解释,可能会有所帮助。如果我们不知道什么风格的正则表达式在起作用,很难知道什么会起作用。
  • @femtoRgon, 172.161.1.1 被排除在外。排除 172.16 但接受 172.161 或 172.16[\d] 的正确方法是什么?
  • @techguy2000 - 应该能够在前瞻部分之后添加\.(参见编辑)
  • 感谢@femtoRgon!我将 3[0-2] 更改为 3[0-1] 因为 172.32.0.0 是公开的:regexr.com/5ehl1
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    正则表达式不是指定 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 显然正在使用某种软件,该软件无法使用正则表达式以外的任何技术验证 IP 地址是否在范围内。因此,如果情况确实如此,那么显然我使用 CIDR 表示法的替代方法不适用于这种特殊情况。但是,我坚持我的回答,当 CIDR 表示法是一种选择时,使用 CIDR 表示法对 IP 地址范围进行编码通常比使用正则表达式更好。

    【讨论】:

    • "只支持正则表达式验证的软件"
    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 2018-02-27
    • 2011-02-18
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多