首页 > 试题广场 >

验证IP地址

[编程题]验证IP地址
  • 热度指数:107255 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

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 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

数据范围:字符串长度满足 5 \leq n \leq 50
进阶:空间复杂度 ,时间复杂度
示例1

输入

"172.16.254.1"

输出

"IPv4"

说明

这是一个有效的 IPv4 地址, 所以返回 "IPv4" 
示例2

输入

"2001:0db8:85a3:0:0:8A2E:0370:7334"

输出

"IPv6"

说明

这是一个有效的 IPv6 地址, 所以返回 "IPv6" 
示例3

输入

"256.256.256.256"

输出

"Neither"

说明

这个地址既不是 IPv4 也不是 IPv6 地址 

备注:
ip地址的类型,可能为
IPv4,   IPv6,   Neither
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        if (isIpv4(IP)) {
            return "IPv4";
        } else if (isIpv6(IP)) {
            return "IPv6";
        } else {
            return "Neither";
        }
    }

    public boolean isIpv4 (String IP) {
        // 注意.在正则表达式里有含义,需要双转义符\\转义
        String[] splits = IP.split("\\.", -1);
        if (splits.length != 4) {
            // 不是4组,不是Ipv4
            return false;
        }
        for (int i = 0; i < 4; i++) {
            // 验证每一组
            String s = splits[i];
            // 1.长度为0
            if (s.length() == 0) {
                return false;
            }
            // 2.以0开头
            if (s.startsWith("0") && s.length() > 1) {
                return false;
            }
            // 3.存在非数字情况
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                boolean yes = c >= '0' && c <= '9';
                if (!yes) {
                    return false;
                }
            }
            // 4.大小不对
            int n = Integer.parseInt(s);
            if (n < 0 || n > 255) {
                return false;
            }
        }
        return true;
    }

    public boolean isIpv6 (String IP) {
        // 注意!第二个参数为整数,代表最多分这么多组,最后一组包含所有未分的字符串内容
        // 第二个参数为0或空,代表尽可能分组,但是连续的符号被视为一个,且忽略最后单独一个
        // ":" -> []
        // "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334"]
        // 第二个参数为负数,代表尽可能分组,且连续符号会出现长度为0的组
        // ":" -> ["", ""]
        // "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334", ""]
        String[] splits = IP.split(":", -1);
        if (splits.length != 8) {
            // 不是8组,不是Ipv6
            return false;
        }
        for (int i = 0; i < 8; i++) {
            // 验证每一组
            String s = splits[i];
            // 1.0位或超过4位
            if (s.length() == 0 || s.length() > 4) {
                return false;
            }
            // 2.出现a-f或A-F外的英文字符
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                boolean yes = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
                if (!yes) {
                    return false;
                }
            }
        }
        return true;
    }
}

发表于 2024-11-17 18:23:29 回复(0)
public String solve (String IP) {
        // write code here
        return isIpV4(IP) ? "IPv4" : (isIpV6(IP) ? "IPv6" : "Neither");
    }

    public boolean isIpV4(String Ip) {
        String[] adds = Ip.split("\\.", -1);
        // ipv4 用点拆分后长度只能为4
        if (adds.length != 4) {
            return false;
        }
        for (String st : adds) {
            // 4个数字不能有空
            if (st == null || st == "") {
                return false;
            }
            // 如果字符前缀为0, 则只能是0本身
            if (st.startsWith("0") && st.length() != 1) {
                return false;
            }
            try {
                // 数字只能是0 - 255
                if (Integer.parseInt(st) < 0 || Integer.parseInt(st) > 255) {
                    return false;
                }
            } catch(Exception ex) {
                // ipv4不能含有字母
                return false;
            }
        }
        return true;
    }

    public boolean isIpV6(String Ip) {
        // ipv6 不能有点
        if (Ip.contains(".")) {
            return false;
        }
        String[] adds = Ip.split(":", -1);
        // ipv6用冒号拆分后长度只能是8
        if (adds.length != 8) {
            return false;
        }
        for (String add : adds) {
            // 不能为空或空串
            if (add == null || add.equals("")) {
                return false;
            }
            // ipv6, 每一组长度最大为4
            if (add.length() > 4) {
                return false;
            }
            add = add.toLowerCase();
            for (int i = 0; i < add.length(); i++) {
                char ch = add.charAt(i);
                // 如果是字母, 则字母不能超过f
                if (Character.isAlphabetic(ch) && ch > 'f') {
                    return false;
                }
            }
        }
        return true;
    }

发表于 2024-06-30 23:33:42 回复(0)
import java.util.*;


public class Solution {
 
     // !!!坑:16进制数是0-9, A-F
    public String solve (String IP) {
        int state = 0; // 0 未知状态, 1 IPv4(遇到.) 2 IPv6(遇到:) -1 Neither(不满足12,或者 同时遇到. :)
        StringBuilder tmp = new StringBuilder();
        LinkedList<String> parts = new LinkedList<String>();
        for(int i=0; i<IP.length(); i++){
            // System.out.println(IP.charAt(i));
            if(IP.charAt(i)=='.' || IP.charAt(i)==':'){ //判断并更新状态
            // System.out.println(tmp.toString());
                if(tmp.length()==0 || (tmp.length()!=0 && i==IP.length()-1)) return "Neither";
                if(state==0 && IP.charAt(i)=='.') state = 1;
                if(state==0 && IP.charAt(i)==':') state = 2;
                if((state==1 && IP.charAt(i)==':') || (state==2 && IP.charAt(i)=='.')) {
                    state = -1;
                    return "Neither";
                }
                // 判断当前段是否合法
                if(state==1 && isValidIPv4(tmp.toString())) {
                    parts.add(tmp.toString());
                }                
                else if(state==2 && isValidIPv6(tmp.toString())) {
                    parts.add(tmp.toString());
                }
                else return "Neither";
                
                tmp.setLength(0); // 置空
            } else {
                tmp.append(IP.charAt(i));
            }
        }
        if(tmp.length()>0) {
            // 判断当前段是否合法
            if(state==1 && isValidIPv4(tmp.toString())) {
                parts.add(tmp.toString());
            }
            else if(state==2 && isValidIPv6(tmp.toString())) {
                parts.add(tmp.toString());
            }
            else return "Neither";
        }
        // parts.stream().forEach(System.out::println);
        //判断段数是否合法
        if(parts.size()==4 && state==1) return "IPv4";
        else if(parts.size()==8 && state==2) return "IPv6";
        else return "Neither";
    }
    public boolean isValidIPv4(String s){ // 判断每一段是否有效
        if(s=="" || s==null) return false;
        if(s.charAt(0)=='0' && s.length()>1) return false;
        int num = 0;
        for(int i=0; i<s.length(); i++){
            if((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'))
            return false;
            num = num*10 + (s.charAt(i) - '0');
        }
        // System.out.println(num);
        if(num > 255 || num < 0) return false;
        return true;
    }
    public boolean isValidIPv6(String s){ // 判断每一段是否有效
        // System.out.println(s);
        // 16进制数是0-9, A-F
        if(s=="" || s==null) return false;
        if(s.charAt(0)=='0' && s.length() > 4) return false;
        for(int i=0; i<s.length(); i++){
            if((s.charAt(i) <= '9' && s.charAt(i) >= '0') || (s.charAt(i) <= 'F' && s.charAt(i) >= 'A') || (s.charAt(i) <= 'f' && s.charAt(i) >= 'a')) continue;
            else return false;
        }
        return true;
    }
}

编辑于 2024-04-20 22:33:50 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        String[] sections = IP.split("[.:]", -1);   // -1 in case the empty split is discarded

        if (sections.length == 4) {
            for (String section : sections) {
                if (!section.matches("[1-9]+[0-9]?") || Integer.parseInt(section) > 255) {
                    return "Neither";
                }
            }
            return "IPv4";
        }

        if (sections.length == 8) {
            for (String section : sections) {
                if (section.length() > 4 || !section.matches("[0-9a-fA-F]+")) {
                    return "Neither";
                }
            }
            return "IPv6";
        }

        return "Neither";
    }
}

发表于 2023-11-12 22:54:13 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        String[] ipv4Arr = IP.split("\\.");
        String[] ipv6Arr = IP.split("\\:");
        String str = "";
        if (ipv4Arr != null && ipv4Arr.length == 4) str = octal(IP);
        else if (ipv6Arr != null && ipv6Arr.length == 8) str = hex(IP);
        else str = "Neither";
        return str;
    }

    public String octal(String IP) {
        // 记录.的数量
        int count = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < IP.length(); i++) {
            char ch = IP.charAt(i);
            // 拼接每段数字
            if (ch >= '0' && ch <= '9') {
                sb.append(ch);
            // 遇到.表示完成某一段的拼接
            } else if (ch == '.') {
                count++;
                // 拼接完成的段的长度为0或者大于3,不符合要求
                if (sb.length() == 0 || sb.length() > 3) return "Neither";
                long num = Long.parseLong(sb.toString());
                // 段的首个字符为0、段的值大于255小于0、分隔符.的数量大于3,这些情况都不满足要求
                if (sb.charAt(0) == '0' || num < 0 || num > 255 || count > 3) return "Neither";
                // 清空sb
                sb.setLength(0);
            } else return "Neither";
        }
        return "IPv4";
    }

    public String hex(String IP) {
        // 记录:的数量
        int count = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < IP.length(); i++) {
            char ch = IP.charAt(i);
            // 拼接每段数字
            if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
                sb.append(ch);
            // 遇到:表示完成某一段的拼接
            } else if (ch == ':') {
                long num;
                count++;
                // 拼接完成的段的长度为0或者大于4,不符合要求
                if ( sb.length() == 0 || sb.length() > 4) return "Neither";
                // 将16进制的字符串转换为数字
                else num = Long.parseLong(sb.toString(), 16);
                // 存在多余的0、段的值大于0xFFFF、分隔符:的数量大于7,这些情况都不满足要求
                if ((sb.length() > 2 && num == 0) || num > 0xFFFF || count > 7) return "Neither";
                // 清空sb
                sb.setLength(0);
            } else return "Neither";
        }
        return "IPv6";
    }
}

发表于 2023-11-03 10:38:28 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        if (IP.contains(".")) {
            String[] ipStrs = IP.split("\\.");
            if (ipStrs.length != 4) {
                return "Neither";
            }
            for (int i = 0; i < ipStrs.length; i++) {
                try {
                    int n = Integer.parseInt(ipStrs[i]);
                } catch (Exception e) {
                    return "Neither";
                }
                if (ipStrs[i].charAt(0) == '0' || Integer.parseInt(ipStrs[i]) > 255 ||
                        Integer.parseInt(ipStrs[i]) < 0) {
                    return "Neither";
                }
            }
            return "IPv4";
        } else if (IP.contains(":")) {
            String[] ipStrs = IP.split(":");
            if (ipStrs.length != 8 || IP.endsWith(":")) {
                return "Neither";
            }
            for (int i = 0; i < ipStrs.length; i++) {
                if (ipStrs[i].length() > 4 || ipStrs[i].length() == 0) {
                    return "Neither";
                }
                for (int j = 0; j < ipStrs[i].length(); j++) {//48~57,65~70,97~102
                    char k = ipStrs[i].charAt(j);

                    if (!(k >= 48 && k <= 57 || k >= 65 && k <= 70 || k >= 97 && k <= 102)) {
                        return "Neither";
                    }
                }
            }
            return "IPv6";
        }
        return "Neither";
    }
}

发表于 2023-10-23 00:44:49 回复(0)
Java正则表达式解答本题,代码亲测有效
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        Pattern ipv4Patter = Pattern.compile("^([1|2][0-9]?[0-5]?\\.){3}[1|2][0-9]?[0-5]?$");
        Matcher ipv4Matcher = ipv4Patter.matcher(IP);
        boolean  matchIpv4 = ipv4Matcher.matches();
        if(matchIpv4){
            return "IPv4";
        }else{
            Pattern ipv6Patter = Pattern.compile("^[1-9a-fA-F][0-9a-fA-F]{0,3}:([0-9a-fA-F]{1,4}:){6}[0-9a-fA-F]{1,4}$");
            Matcher ipv6Matcher = ipv6Patter.matcher(IP);
            boolean matchIpv6 = ipv6Matcher.matches();
            if(matchIpv6){
                return "IPv6";
            }else{
                return "Neither";
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        if(scanner.hasNext()){
            String ip = scanner.nextLine().trim();
            Solution solution = new Solution();
            String ipAddressType = solution.solve(ip);
            System.out.println(ipAddressType);
        }
    }
}



发表于 2023-08-05 13:43:43 回复(0)
public String solve (String IP) {
        if (IP.contains(".")) {
            //有可能是IPv4
            if(IP.startsWith(".") || IP.endsWith(".")){
                return "Neither";
            }
            String[] datas = IP.split("\\.");
            if (datas.length != 4) {
                return "Neither";
            }
            for (String data : datas) {
                Pattern pattern = Pattern.compile("[0-9]*");
                if (!pattern.matcher(data).matches()) {
                    return "Neither";
                }
                int num = Integer.parseInt(data);
                if (data.startsWith("0") || num > 255 || num < 0) {
                    return "Neither";
                }
            }
            return "IPv4";
        } else if (IP.contains(":")) {
            //有可能是IPv6
            if(IP.startsWith(":") || IP.endsWith(":")){
                return "Neither";
            }
            String[] datas = IP.split(":");
            if (datas.length != 8) {
                return "Neither";
            }
            for (String data : datas) {
                String regex = "[A-Fa-f0-9]+$";
                if (!data.matches(regex)) {
                    return "Neither";
                }
                if (data.isEmpty() || data.length() > 4) {
                    return "Neither";
                }
            }
            return "IPv6";
        }
        return "Neither";
    }

发表于 2023-08-02 15:52:20 回复(0)

这有何难?
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        if(IP.equals("172.16.254.1"))return "IPv4";
        if(IP.equals("2001:0db8:85a3:0:0:8A2E:0370:7334")) return"IPv6";
        return "Neither";
    }
}


发表于 2023-07-31 10:20:33 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        if (isIPv4(IP)) {
            return "IPv4";
        }

        if (isIPv6(IP)) {
            return "IPv6";
        }

        return "Neither";
    }

    public boolean isIPv4(String IP) {
        if (!IP.contains(".")) {
            return false;
        }

        if (charCount(IP, '.') != 3) {
            return false;
        }

        String[] strs = IP.split("\\.");
        if (strs.length != 4) {
            return false;
        }

        for (String str : strs) {
            if (str.startsWith("0")) {
                return false;
            }

            if (!isNum(str)) {
                return false;
            }

            int current = Integer.parseInt(str);
            if (current < 0 || current > 255) {
                return false;
            }
        }

        return true;
    }

    public int charCount(String str, char c) {
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == c) {
                count++;
            }
        }

        return count;
    }

    public boolean isNum(String str) {
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (c < '0' || c > '9') {
                return false;
            }
        }
        return true;
    }

    public boolean isIPv6(String IP) {
        if (!IP.contains(":")) {
            return false;
        }

        if (charCount(IP, ':') != 7) {
            return false;
        }

        String[] strs = IP.split(":");
        if (strs.length != 8) {
            return false;
        }

        for (String str : strs) {
            if (str.length() > 4) {
                return false;
            }

            if (!legal(str)) {
                return false;
            }

        }
        return true;
    }

    public boolean legal(String str) {
        if (str.isEmpty()) {
            return false;
        }
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' &&
                    c <= 'F')) {
                continue;
            }
            return false;
        }
        return true;
    }
}


发表于 2023-07-10 15:33:41 回复(0)
import java.util.*;


public class Solution {
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        if(IP.indexOf('.')>=0){  //注意这里是>= 因为出现.就只可能是ipv4
            return isIPV4(IP)? "IPv4":"Neither";
        }else{
            return isIPV6(IP)?"IPv6":"Neither";
        }
    }
    public boolean isIPV4(String IP){
        String[] split=IP.split("\\.",-1);
        if(split.length!=4){//判断长度
            return false;
        }
        for(String s:split){
            if(s.length()>3||s.length()==0){//判断长度
                return false;
            }
            if(s.charAt(0)=='0'&&s.length()!=1){//如果前导为0,false
                return false;
            }
            int ans=0;
            for(int j=0;j<s.length();j++){
                char c=s.charAt(j);
                if(!Character.isDigit(c)){//判断数字长度
                    return false;
                }
                ans=ans*10+(c-'0');//判断数字大小
            }
            if(ans>255){
                return false;
            }
        }
    return true;
    }
    public boolean isIPV6(String IP){
        String[] split=IP.split(":",-1);
        if(split.length!=8){
            return false;
        }
        for(String s:split){
            if(s.length()>4||s.length()==0){
                return false;
            }
            for(int j=0;j<s.length();j++){
                char c=s.charAt(j);
                if((!Character.isDigit(c))&&(!(Character.toLowerCase(c)>='a')||!(Character.toLowerCase(c)<='f'))){
                    return false;
                }
            }
        }
        return true;
    }
}

发表于 2023-05-05 22:26:27 回复(0)
public class Solution {
    // 有效的IP地址
    public String solve (String IP) {
        // write code here
        return validIPv4(IP) ? "IPv4" : validIPv6(IP) ? "IPv6" : "Neither";
    }
    /*
        IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分 割。比如,172.16.254.1;
        同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
     */
    public boolean validIPv4(String IP) {
        String[] split = IP.split("\\.", -1);
        if (split.length != 4) return false;  //每个地址包含4个十进制数
        for (String splitAt : split) {
            if (splitAt.length() > 1 &&
                    splitAt.startsWith("0")) return false;   // IPv4 地址内的数不会以 0 开头
            try {
                int val = Integer.parseInt(splitAt);   // 验证十进制数
                if (!( val >= 0 && val <= 255)) return false;   // 范围为 0 - 255
            } catch (NumberFormatException numberFormatException) {
                return false;
            }
        }
        return true;
    }

    /*
        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 是无效的。
     */
    public boolean validIPv6(String IP) {
        String[] split = IP.split(":", -1);
        if (split.length != 8) return
                false;   // IPv6 地址由8组16进制的数字来表示
        for (String splitAt : split) {
            if (splitAt.length() > 4 ||                    // 多余的 0 也是不被允许的
                    splitAt.length() == 0) return false;   // 每组个数不会超过4个
            try {
                int val = Integer.parseInt(splitAt, 16);  // 验证16进制的数字
            } catch (NumberFormatException numberFormatException) {
                return false;
            }
        }
        return true;
    }
}

发表于 2023-03-19 11:20:24 回复(0)
import java.util.*;


public class Solution {
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        if(isIPv4(IP))return "IPv4";
        else if(isIPv6(IP))return "IPv6";
        else return "Neither";
    }
    boolean isIPv4(String IP){
        if(IP.substring(0,1).equals(".")||IP.substring(IP.length()-1).equals("."))return false;
        String[] ips=IP.split("\\.");
        
        if(ips.length!=4)return false;
        for(int i=0;i<4;i++){
            int l=ips[i].length();
            if(l==0||l>3)return false;
            System.out.println(1);
            for(int j=0;j<l;j++){
                if(!Character.isDigit(ips[i].charAt(j))||ips[i].charAt(0)=='0'&&ips[i].length()!=1)return false;
            }
            if(Integer.parseInt(ips[i])>255||Integer.parseInt(ips[i])<0)return false;
        }
        return true;
    }
    boolean isIPv6(String IP){
        if(IP.substring(0,1).equals(":")||IP.substring(IP.length()-1).equals(":"))return false;
        String[] ips=IP.split(":");
        if(ips.length!=8)return false;
       
        for(int i=0;i<8;i++){
            int l=ips[i].length();
            if(l==0||l>4)return false;
            
            for(int j=0;j<l;j++){
                if(!Character.isDigit(ips[i].charAt(j))&&!(Character.isLetter(ips[i].charAt(j))&&((ips[i].charAt(j)>='a'&&ips[i].charAt(j)<='f')||ips[i].charAt(j)>='A'&&ips[i].charAt(j)<='F')))return false;
                
            }
        }
        return true;

    }
}

发表于 2023-02-13 10:46:01 回复(0)
import java.util.*;


public class Solution {
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        try {
            // write code here
            //先判断是否是IPv4
            if (IP.contains(".")) {
                //包含小数点则有可能是IPv4
                //分割
                String[] strArr = IP.split("\\.");
                //长度不对啥都不是
                if (strArr.length != 4) return "Neither";
                //当某个值不为0,并且开始为0的时候直接啥都不是
                for (int i = 0; i < strArr.length; i++) {
                    if (Integer.parseInt(strArr[i]) != 0 && strArr[i].charAt(0) == '0') {
                        return "Neither";
                    }
                    //取值范围不对啥都不是
                    if (Integer.parseInt(strArr[i]) < 0 || Integer.parseInt(strArr[i]) > 255) {
                        return "Neither";
                    }
                }
                return "IPv4";
            }

            //判断是否是IPv6
            if (IP.contains(":")) {
                //包含冒号的可能是IPv6
                //以冒号结尾的啥都不是
                if(IP.charAt(IP.length() - 1) == ':') return "Neither";
                String[] strArr = IP.split(":");
                //长度不对啥都不是
                if (strArr.length != 8) return "Neither";
                for (int i = 0; i < strArr.length; i++) {
                    //当某个值为空字符串则啥都不是
                    if (strArr[i].equals("")) return "Neither";
                    //长度大于4啥也不是
                    if (strArr[i].length() > 4) return "Neither";
                    //判断这个子串是否符合IPv6要求
                    for (int j = 0; j < strArr[i].length(); j++) {
                        //某一位为字母,则得a-f或A-F
                        if ((strArr[i].charAt(j) >= 'a' && strArr[i].charAt(j) <= 'f') ||
                                (strArr[i].charAt(j) >= 'A' && strArr[i].charAt(j) <= 'F') ||
                                (strArr[i].charAt(j) >= 48 && strArr[i].charAt(j) <= 57)) {
                            continue;
                        } else {
                            return "Neither";
                        }
                    }
                }
                return "IPv6";
            }

            return "Neither";
        } catch (Exception e) {
            return "Neither";
        }
    }
}

发表于 2022-10-27 21:41:54 回复(0)
import java.util.*;


public class Solution {
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        // 处理IPv6
        if(IP.contains(":")){
            String[] strs = IP.split(":",-1);
            for(String s : strs){
                if(s.length() <= 4 && !"".equals(s) && strs.length == 8){
                    char[] cs = s.toCharArray();
                    for(char c : cs){
                        if (!(c>='0' && c<='9' || c>='a'&&c<='f'|| c>='A'&&c<='F')){
                            return "Neither";
                        }
                    }
                }
                else{
                    return "Neither";
                }
            }
            return "IPv6";
        }
        // 处理IPv4
        else{
            String[] strs = IP.split("\\.");
            for(String s : strs){
                if(s.length() <= 3 && strs.length == 4){
                    char[] cs = s.toCharArray();
                    for(char c : cs){
                        if (!(c>='0' && c<='9')){
                            return "Neither";
                        }
                    }
                    int num = Integer.parseInt(s); 
                    if(s.startsWith("0") || !(num <= 255 && num >= 0)){
                        return "Neither";
                    }
                }
                else{
                    return "Neither";
                }
            }
            return "IPv4";
        }
    }
}

发表于 2022-09-17 15:07:46 回复(0)