将IPv6地址转为全写或简写格式--JAVA

输入IPv6地址,IPv6地址可以为全写、简写、半简写,或者包含前导0等任意形式

parseFullIPv6函数:将输入的IPv6地址格式化为全写格式,省略前导0

parseAbbrIPv6函数:将输入的IPv6地址格式化为简写格式

public static final String IPv6Reg = "([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$"
            + "|^:((:[\\da-fA-F]{1,4}){1,6}|:)$"
            + "|^[\\da-fA-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)$"
            + "|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)$"
            + "|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3}|:)$"
            + "|^([\\da-fA-F]{1,4}:){4}((:[\\da-fA-F]{1,4}){1,2}|:)$"
            + "|^([\\da-fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?$"
            + "|^([\\da-fA-F]{1,4}:){6}:"; // IPv6地址的格式

/**
 * 将一个IPv6地址转为全写格式,全写中的前导0省略
 * 例:将1ade:03da:0::转为1ade:3da:0:0:0:0:0:0
 *
 * @param IPv6Str
 * @return fullIPv6
 */
public static String parseFullIPv6(String IPv6Str) {
    // 判断IPv6地址的格式是否正确
    if (!IPv6Str.matches(IPv6Reg)) {
        return "";
    }

    String[] arr = new String[]{"0", "0", "0", "0", "0", "0", "0", "0"};

    // 将IPv6地址用::分开
    // 如果IPv6地址为::,tempArr.length==0
    // 如果不包含::或以::结尾,tempArr.length==1
    // 如果以::开头或::在中间,tempArr.length==2
    String[] tempArr = IPv6Str.split("::");

    // tempArr[0]用:分开,填充到arr前半部分
    if (tempArr.length > 0) {
        // new String[0]为空数组,因为"".split(":")为{""},如果tempArr[0]=="",此时数组包含一个元素
        String[] tempArr0 = tempArr[0].isEmpty() ? new String[0] : tempArr[0].split(":");
        for (int i = 0; i < tempArr0.length; i++) {
            // 如果是纯数字,用parseInt去除前导0,如果包含字母,用正则去除前导0
            arr[i] = tempArr0[i].matches("\\d+")
                    ? (Integer.parseInt(tempArr0[i]) + "")
                    : tempArr0[i].replaceAll("^(0+)", "");
        }
    }

    // tempArr[1]用:分开,填充到arr后半部分
    if (tempArr.length > 1) {
        String[] tempArr1 = tempArr[1].isEmpty() ? new String[0] : tempArr[1].split(":");
        for (int i = 0; i < tempArr1.length; i++) {
            arr[i + arr.length - tempArr1.length] = tempArr1[i].matches("\\d+")
                    ? (Integer.parseInt(tempArr1[i]) + "")
                    : tempArr1[i].replaceAll("^(0+)", "");
        }
    }

    return StringUtils.join(arr, ":");
}

/**
 * 将一个IPv6地址转为简写格式
 * 例:将1ade:03da:0::转为1ade:3da::
 *
 * @param IPv6Str
 * @return AbbrIPv6
 */
public static String parseAbbrIPv6(String IPv6Str) {
    // 将一个IPv6地址转为全写格式,全写中的前导0省略
    String fullIPv6 = parseFullIPv6(IPv6Str);
    if (fullIPv6.isEmpty()) { // 如果IPv6地址的格式不正确
        return "";
    }

    // 将1ade:3da:0:0:0:0:0:99转为{"-","-","0","0","0","0","0","-"}
    String[] arr = fullIPv6.split(":");
    for (int i = 0, len = arr.length; i < len; i++) {
        if (!"0".equals(arr[i])) {
            arr[i] = "-";
        }
    }

    // 找到最长的连续的0
    Pattern pattern = Pattern.compile("0{2,}");
    Matcher matcher = pattern.matcher(StringUtils.join(arr, ""));
    String maxStr = "";
    int start = -1;
    int end = -1;
    while (matcher.find()) {
        if (maxStr.length() < matcher.group().length()) {
            maxStr = matcher.group();
            start = matcher.start();
            end = matcher.end();
        }
    }

    // 合并
    arr = fullIPv6.split(":");
    if (maxStr.length() > 0) {
        for (int i = start; i < end; i++) {
            arr[i] = ":";
        }
    }
    return StringUtils.join(arr, ":").replaceAll(":{2,}", "::");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值