最后一部分非零的 IP 地址的正则表达式

Regex for IP address with last part non-zero

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

^([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 //无效

非正则表达式解决方案如何:

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 并进行一些边界检查,如果您还期待一些疯狂的输入。我相信这更具可读性,因此更易于维护

确保您的号码不开头...

[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])

只对最后一部分进行特殊处理

^((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]?)$