1. 程式人生 > >驗證合法IPV4和IPV6

驗證合法IPV4和IPV6

import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
        System.out.println(new Main().isIPv4(".13.13.14"));//false
        System.out.println(new Main().isIPv4("123..13.14"));//false
        System.out.println(new Main().isIPv4("123.13.013.14"));//true
        System.out.println(new Main().isIPv4("123.13.413.14"));//false
        System.out.println(new Main().isIPv4("123.13.00.14"));//true
        System.out.println(new Main().isIPv4("123.13.13*14"));//false
        System.out.println(new Main().isIPv4("123.13.13.14"));//true

        System.out.println(new Main().isIPv6("1234:123A:234D:5678:1234:123A:234D:5678"));//true
        System.out.println(new Main().isIPv6(":123A:234D:5678:1234:123A:234D:5678"));//false
        System.out.println(new Main().isIPv6("1234:123A::123A:234D:5678"));//true
    }//main

//^ 匹配輸入字串的開始位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。
//$ 匹配輸入字串的結束位置。如果設定了RegExp 物件的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
//? 匹配前面的子表示式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價於 {0,1}。
//{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
//{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
//*	匹配前面的子表示式零次或多次。要匹配 * 字元,請使用 \*。
// [a-z] 字元範圍。匹配指定範圍內的任意字元。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字元。可以匹配0個或多個
// + 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。

    public boolean isIPv4(String str) {
        if (!Pattern.matches("[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+", str))
            return false;
        else {
            String[] arrays = str.split("\\.");//  這裡的 \\ 不能少
            if (Integer.parseInt(arrays[0]) < 256 && arrays[0].length() <= 3
                    && Integer.parseInt(arrays[1]) < 256 && arrays[1].length() <= 3
                    && Integer.parseInt(arrays[2]) < 256 && arrays[2].length() <= 3
                    && Integer.parseInt(arrays[3]) < 256 && arrays[3].length() <= 3)
                return true;
            else return false;
        }
    }

    public boolean isIPv6(String str) {
        return isIPV6Std(str) || isIPV6Compress(str);
    }

    public boolean isIPV6Std(String str) {
        if (!Pattern.matches("^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$", str))
            return false;
        return true;
    }

    public boolean isIPV6Compress(String str) {
        if (!Pattern.matches(
                "^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$", str))
            return false;
        return true;
    }
}