编写一个函数来验证输入的字符串是否是有效的 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
仅由英文字母,数字,字符'.'
和':'
组成。
/**
* @param {string} IP
* @return {string}
*/
var validIPAddress = function (IP) {
let out = "Neither";// IPv4,IPv6,Neither
// IPv4
if (IP.includes(".")) {
// check contain only . and number
for (let i = 0; i < IP.length; i++) {
if (!((IP.charCodeAt(i) > 47 && IP.charCodeAt(i) < 58) || IP.charAt(i) == '.')) {
return "Neither";
}
}
let 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";
}
let n1 = parseInt(IParr[0]);
let n2 = parseInt(IParr[1]);
let n3 = parseInt(IParr[2]);
let n4 = parseInt(IParr[3]);
if (n1 <= 255 && n1 >= 0 && n2 <= 255 && n2 >= 0 && n3 <= 255 && n3 >= 0 && n4 <= 255 && n4 >= 0) {
let str = (n1 + "." + n2 + "." + n3 + "." + n4);
if (str.length == IP.length) {
out = "IPv4";
}
}
}
}
// IPv6
let someChar = ':';
let count = 0;
for (let i = 0; i < IP.length; i++) {
if (IP.charAt(i) == someChar) {
count++;
}
}
// System.out.println(count);
if (count == 7) {
for (let i = 0; i < IP.length; i++) {
if (!((IP.charCodeAt(i) > 47 && IP.charCodeAt(i) < 58) || 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";
}
}
let 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) {
let n1 = parseInt(IParr[0], 16);
let n2 = parseInt(IParr[1], 16);
let n3 = parseInt(IParr[2], 16);
let n4 = parseInt(IParr[3], 16);
let n5 = parseInt(IParr[4], 16);
let n6 = parseInt(IParr[5], 16);
let n7 = parseInt(IParr[6], 16);
let n8 = 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;
};