非正则方式验证ipv4

437 阅读1分钟

验证规则:

  • 1 每个字符要么是分隔符.要么是数字;
  • 2 分隔符有3个,且不能连续;
  • 3 分隔后:
    • 每段长度不能大于3;
    • 每段要么是0,要么不能以0开头;
    • 转为数字值后不能大于255。

拆分段:

public static boolean validate(String ip){
        if (null == ip) {
            return false;
        }

        // 分隔段
        char[] segment = null;
        // 分隔段长度
        int segSize = 0;
        // 分隔符个数
        int seperatorCount = 0;

        char[] arr = ip.trim().toCharArray();

        for (int count = 0; count < arr.length; count++) {

            char c = arr[count];

            // 只能出现分隔符.和数字
            if (c != 46 && (c < 48 || c > 57)) {
                //ascii : 46->. 48..57->0..9
                return false;
            }

            if (c == 46) {
                // 当前是分隔符
                if(++seperatorCount > 3){
                    return false;
                }

                if (segSize == 0 || null == segment) {
                    // 不能以分隔符开头
                    return false;
                }
                
                 if(count == arr.length - 1){
                    // 不能以分隔符结尾
                    return false;
                }

                if(segment[segSize-1] == 46){
                    // 不能连续两个分隔符
                    return false;
                }

                // 验证分段
                if (!validateSegment(segment, segSize)) {
                    return false;
                }

                // 验证完成,segment置null
                segment = null;

                continue;

            }

            // 重新初始化segment
            if (null == segment) {
                segment = new char[3];
                segSize = 0;
            }

            if (segSize + 1 > 3) {
                // segment不能超过3
                return false;
            }
            
            //当前字符放入segment,同时segSize递增
            segment[segSize++] = c;

            // 最后一个字符 结束再次判断
            if (count == arr.length - 1) {
                if (!validateSegment(segment, segSize)) {
                    return false;
                }

            }

        }

        if(seperatorCount != 3){
            return false;
        }

        return true;
    }

验证分隔段:

private static boolean validateSegment(char[] segment, int segSize) {
        if(segSize == 0){
            return false;
        }
        if (segSize > 1 && segment[0] == '0') {
            // segment不能0开头
            return false;
        }

        Integer checkValue = Integer.valueOf(String.valueOf(Arrays.copyOf(segment, segSize)));

        if (checkValue > 255) {
            return false;
        }

        return true;
    }