【问题标题】:Regex for IP address with last part non-zero最后一部分非零的 IP 地址的正则表达式
【发布时间】:2026-01-21 18:35:01
【问题描述】:

这是我的 IP 地址正则表达式。如何修改它以在最后一部分中排除 0(零)。

^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\d\d?|2[0-4]\d|25[0-5])$

例子:

148.23.54.20 //有效

148.23.54.0 //无效

【问题讨论】:

    标签: java regex regex-group


    【解决方案1】:

    确保您的号码以零开头...

    [1-9]\d?
    

    因此,例如,您的正则表达式将以

    结尾
    \.([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$
    

    这将允许 1 到 255。

    为了清楚起见,省略了额外的转义。

    旁注

    对于 可能为 0 的其他 3 种情况,只需添加一个仅 0 的选项

    \.(0|[1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])
    

    【讨论】:

      【解决方案2】:

      仅对最后部分进行特殊处理

      ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?)$
      

      【讨论】:

      • 虽然这可行,但它允许 IP 的最后一部分带有前面的零,这在 IP 中是无效的。
      【解决方案3】:

      非正则表达式解决方案怎么样:

      String ip = /* some ip */;
      String[] bytes = ip.split("\\.");
      if (!bytes[3].equals("0") && Arrays.stream(bytes).map(Integer::parseInt).allMatch(i -> i >= 0 && i < 256)) {
          //Valid ip
      }
      

      您可以检查IntegerParseException,如果您还期待一些疯狂的输入,请进行一些边界检查。我相信这更具可读性,因此可以维护

      【讨论】: