必备知识
在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);
}
}
}
效果展示