468. 验证IP地址

编写一个函数来验证输入的字符串是否是有效的 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;
};

 

上一篇:【剑指Offer】个人学习笔记_48_最长不含重复字符的子字符串


下一篇:element ui 下拉树组件el-tree半选节点和选中节点的提交与回显