无法去掉IP地址中的前导零

3
该函数应该移除IPv4地址中的前导零。例如,地址007.006.02.90 应被转换为7.6.2.90 。看起来问题出在这一行:
public static String zero_cutter(String ip) {
    String ipnew;
    String []  spliti = ip.split(".");
    int[] myArray = new int[4];

    for (int i = 0; i < 4; i++) {
        myArray [i] = Integer.parseInt(spliti [i]);
    }

    for (int i = 0; i < 4; i++) {
        spliti [i]  = Integer.toString(myArray [i]);
    }
    ipnew = spliti [0] + "." + spliti [1] + "." + spliti [2] +    "." + spliti [3];

    return ipnew;
}

1
“split” 接受一个正则表达式作为参数。在正则表达式中,“.”是一个特殊字符。使用“split("[.]")”。 - f1sh
3个回答

7
您需要在模式中转义 . 字符,因为点是一个特殊字符,可以匹配任何字符(根据 java.util.regex.Pattern javadoc)。您可以使用 \\ 来实现转义。以下是有关预定义字符类的信息:

预定义字符类

. 任何字符(可能匹配行终止符)

这是一种在模式中使用 \\ 的方法:

String[] spliti = ip.split("\\.");\

不过,你可以使用InetAddress类来替换你的代码:

String ip = "007.006.002.090";
InetAddress addr = InetAddress.getByName(ip);
System.out.println(addr.getHostAddress()); // 7.6.2.90

转义可能比我使用字符类的答案更便宜。这是更好的答案。 - f1sh

1

split 接受一个正则表达式作为参数。在正则表达式中,. 是一个特殊字符(表示任何字符)。使用 split("[.]") 可以将字符串按照每个句点分割。

另外一种更简洁的写法是:

return Arrays.stream(ip.split("[.]")).map(Integer::valueOf).collect(Collectors.joining(".");

1

受到接受正则表达式的分割操作的启发,这里提供了一种基于正则表达式的解决方案(尚未经过测试)。

public static String zero_cutter(String ip) {
    return ip.replaceAll("(?<=^|\\.)0+(?!\\.|$)","");
}

值得注意的是,此解决方案不验证给定的IP地址,也不检查其是否为“null”。 - samthecodingman
不错!原始代码也没有进行任何检查或验证,所以这样做很好! - f1sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接