编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
- 如果是有效的 IPv4 地址,返回
"IPv4"
; - 如果是有效的 IPv6 地址,返回
"IPv6"
; - 如果不是上述类型的 IP 地址,返回
"Neither"
。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1
;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01
是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334
是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334
也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334
是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334
是无效的。
示例 1:
输入:IP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:IP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址
示例 4:
输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:" 输出:"Neither"
示例 5:
输入:IP = "1e1.4.5.6" 输出:"Neither"
提示:
IP
仅由英文字母,数字,字符'.'
和':'
组成。
public class Solution468 {
public String validIPAddress(String IP) {
String out = "Neither";// IPv4,IPv6,Neither
// IPv4
if (IP.contains(".")) {
// check contain only . and number
for (int i = 0; i < IP.length(); i++) {
if (!(Character.isDigit(IP.charAt(i)) || IP.charAt(i) == '.')) {
return "Neither";
}
}
String[] IParr = IP.split("\\.");
// System.out.println(Arrays.toString(IParr));
if (IParr.length == 4) {
if (IParr[0].length() > 3 || IParr[0].length() < 1 || IParr[1].length() > 3 || IParr[1].length() < 1
|| IParr[2].length() > 3 || IParr[2].length() < 1 || IParr[3].length() > 3
|| IParr[3].length() < 1) {
return "Neither";
}
int n1 = Integer.parseInt(IParr[0]);
int n2 = Integer.parseInt(IParr[1]);
int n3 = Integer.parseInt(IParr[2]);
int n4 = Integer.parseInt(IParr[3]);
if (n1 <= 255 && n1 >= 0 && n2 <= 255 && n2 >= 0 && n3 <= 255 && n3 >= 0 && n4 <= 255 && n4 >= 0) {
String str = (n1 + "." + n2 + "." + n3 + "." + n4);
if (str.length() == IP.length()) {
out = "IPv4";
}
}
}
}
// IPv6
char someChar = ':';
int count = 0;
for (int i = 0; i < IP.length(); i++) {
if (IP.charAt(i) == someChar) {
count++;
}
}
// System.out.println(count);
if (count == 7) {
for (int i = 0; i < IP.length(); i++) {
if (!(Character.isDigit(IP.charAt(i)) || IP.charAt(i) == ':' || IP.charAt(i) == 'a'
|| IP.charAt(i) == 'b' || IP.charAt(i) == 'c' || IP.charAt(i) == 'd' || IP.charAt(i) == 'e'
|| IP.charAt(i) == 'f' || IP.charAt(i) == 'A' || IP.charAt(i) == 'B' || IP.charAt(i) == 'C'
|| IP.charAt(i) == 'D' || IP.charAt(i) == 'E' || IP.charAt(i) == 'F')) {
return "Neither";
}
}
String[] IParr = IP.split("\\:");
// System.out.println(Arrays.toString(IParr));
// System.out.println(IParr.length);
if (IParr.length == 8) {
if (IParr[0].length() > 4 || IParr[0].length() < 1 || IParr[1].length() > 4 || IParr[1].length() < 1
|| IParr[2].length() > 4 || IParr[2].length() < 1 || IParr[3].length() > 4
|| IParr[3].length() < 1 || IParr[4].length() > 4 || IParr[4].length() < 1
|| IParr[5].length() > 4 || IParr[5].length() < 1 || IParr[6].length() > 4
|| IParr[6].length() < 1 || IParr[7].length() > 4 || IParr[7].length() < 1) {
return "Neither";
}
if (IParr[0].length() <= 4 && IParr[1].length() <= 4 && IParr[2].length() <= 4 && IParr[3].length() <= 4
&& IParr[4].length() <= 4 && IParr[5].length() <= 4 && IParr[6].length() <= 4
&& IParr[7].length() <= 4) {
int n1 = Integer.parseInt(IParr[0], 16);
int n2 = Integer.parseInt(IParr[1], 16);
int n3 = Integer.parseInt(IParr[2], 16);
int n4 = Integer.parseInt(IParr[3], 16);
int n5 = Integer.parseInt(IParr[4], 16);
int n6 = Integer.parseInt(IParr[5], 16);
int n7 = Integer.parseInt(IParr[6], 16);
int n8 = Integer.parseInt(IParr[7], 16);
if (n1 <= 65535 && n1 >= 0 && n2 <= 65535 && n2 >= 0 && n3 <= 65535 && n3 >= 0 && n4 <= 65535
&& n4 >= 0 && n5 <= 65535 && n5 >= 0 && n6 <= 65535 && n6 >= 0 && n7 <= 65535 && n7 >= 0
&& n8 <= 65535 && n8 >= 0) {
out = "IPv6";
}
}
}
}
return out;
}
public static void main(String[] args) {
Solution468 sol = new Solution468();
// String IP = "172.16.254.1";
// String IP = "1e1.4.5.6";
// String IP = "12..33.4";
// String IP = "1.0.1.";
String IP = ":::::::";
// String IP = "2001:db8:85a3:0::8a2E:0370:7334";
// String IP = "2001:0db8:85a3:0:0:8A2E:0370:7334";
// String IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:";
System.out.println(sol.validIPAddress(IP));
}
}