必备知识

在Java中,使用String.split()方法分割字符串时,需要特别注意分隔符是基于正则表达式的。这意味着某些字符,如点(.),在正则表达式中具有特殊含义,而点(.)是正则表达式中的一个元字符,代表匹配任何单个字符。

1. 使用str.split(".")

当你尝试使用str.split(".")来分割字符串时,你实际上是在告诉Java使用任意字符作为分隔符。这意味着:

  • ".":在正则表达式中,.表示匹配除换行符以外的任何单个字符。
  • 结果:此调用将不按预期工作,因为它会把字符串分割成单个字符,而不是以.为分隔符来分割。

例如:

String str = "one.two.three";
String[] fields = str.split(".");
System.out.println(Arrays.toString(fields)); // 输出 []

输出是空数组,因为.作为匹配所有字符的元字符,导致没有任何东西保留下来。

2. 使用str.split("\\.")

为了正确地使用点(.)作为分隔符,你需要对其进行转义,以便它被解释为文字字符而不是正则表达式的元字符。

  • "\\.":在Java字符串中,反斜杠(\)自身需要转义,所以你需要使用两个反斜杠来表示一个真正的反斜杠,而\.则是正则表达式中转义的点符号。
  • 结果:这样会按照字面意义的点(.)来正确分割字符串。

例如:

String str = "one.two.three";
String[] fields = str.split("\\.");
System.out.println(Arrays.toString(fields)); // 输出 [one, two, three]

这时输出正确地显示了使用点作为分隔符分割的数组。

总结

总之,当使用String.split()方法和正则表达式分隔符时,务必记住转义那些在正则表达式中有特殊意义的元字符,如点(.)。使用str.split("\\.")确保点字符被正确处理为分隔符。

示例代码

import java.util.*;

public class Main {

    public String convert(String str) {
        // ipv4 -> int
        if (str.contains(".")) {
            //"\\.":在Java字符串中,反斜杠(\)自身需要转义,所以你需要使用两个反斜杠来表示一个真正的反斜杠,而\.则是正则表达式中转义的点符号。
            //".":在正则表达式中,.表示匹配除换行符以外的任何单个字符。
            String[] fields = str.split("\\.");
            long result = 0;//int的范围不够用
            for (int i = 0; i < 4; i++) {
                //result * 256相当于把result左移了8位
                result = result * 256 + Integer.parseInt(fields[i]);
            }
            return "" + result;
        }
        // int -> ipv4
        else {
            long ipv4 = Long.parseLong(str);
            String result = "";
            for (int i = 0; i < 4; i++) {
                result = ipv4 % 256 + "." + result;
                ipv4 /= 256;
            }
            return result.substring(0, result.length() - 1);//result.length() - 1去掉最后一个.
        }
    }

    public static void main(String[] args) {
        Main solution = new Main();
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.next();
            String res = solution.convert(str);
            System.out.println(res);
        }
    }
}

效果展示

牛客---HJ33 整数与IP地址间的转换_java