Nice programing

Java에서 IPv4 주소 유효성 검사

nicepro 2020. 12. 13. 11:09
반응형

Java에서 IPv4 주소 유효성 검사


Java를 사용하여 IPv4 주소의 유효성을 검사하고 싶습니다. 점 10 진수 표기법을 사용하여 작성해야 하므로 3 개의 점 ( " .")이 있어야하며 문자가 없어야하며 점 사이의 숫자는 유효한 범위에 있어야합니다. 어떻게해야합니까?


이 기능을 사용할 수 있습니다-

public static boolean validate(final String ip) {
    String PATTERN = "^((0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)\\.){3}(0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)$";

    return ip.matches(PATTERN);
}

정규 표현식으로 매우 간단합니다 (그러나 Apache Commons 유틸리티를 사용하는 worpet의 답변보다 훨씬 덜 효율적이고 읽기가 훨씬 어렵습니다)

private static final Pattern PATTERN = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return PATTERN.matcher(ip).matches();
}

묵경 이후


InetAddressValidator 유틸리티 클래스를 사용해보십시오.

여기 문서 :

http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/InetAddressValidator.html

여기에서 다운로드 :

http://commons.apache.org/validator/


사용 구아바

InetAddresses.isInetAddress(ipStr)

다음과 같이 정규식을 사용할 수 있습니다.

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))

이것은 값이 범위 내에 있는지 확인합니다.

Android는 정규 표현식을 지원합니다. java.util.regex.Pattern을 참조하십시오 .

class ValidateIPV4
{

   static private final String IPV4_REGEX = "(([0-1]?[0-9]{1,2}\\.)|(2[0-4][0-9]\\.)|(25[0-5]\\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))";
   static private Pattern IPV4_PATTERN = Pattern.compile(IPV4_REGEX);

   public static boolean isValidIPV4(final String s)
   {          
      return IPV4_PATTERN.matcher(s).matches();
   }
}

패턴을 반복해서 다시 컴파일하지 않으려면 Pattern.compile()한 번만 실행되도록 호출하는 것이 가장 좋습니다 .


문서화되지 않은 유틸리티 클래스도있다 sun.net.util.IPAddressUtil, 당신이 실제로 사용하지 말아야 가 빠른 일회성, 던져 - 멀리 유틸리티에 유용 할 수도 있지만이 :

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);

내부적으로 이것은 InetAddressIP 주소를 구문 분석하는 데 사용 하는 유틸리티 클래스 입니다.

점 10 진수 표기법이 아니라 기술적으로 유효한 IPv4 주소 인 "123"과 같은 문자열에 대해 true를 반환합니다 .


이것은 Android 용이며 IPv4 및 IPv6 테스트입니다.

참고 : 일반적으로 사용되는 InetAddressUtils것은 더 이상 사용되지 않습니다. 새로운 InetAddress수업 사용

public static Boolean isIPv4Address(String address) {
    if (address.isEmpty()) {
        return false;
    }
    try {
        Object res = InetAddress.getByName(address);
        return res instanceof Inet4Address || res instanceof Inet6Address
    } catch (final UnknownHostException ex) {
        return false;
    }
}

IP4 인 경우 다음과 같이 정규식을 사용할 수 있습니다.

^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\.){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$.


IPAddress Java 라이브러리 가이를 수행합니다. javadoc은 링크에서 사용할 수 있습니다. 면책 조항 : 저는 프로젝트 관리자입니다.

이 라이브러리는 IPv4 및 IPv6를 투명하게 지원하므로 유효성 검사는 아래에서 동일하게 작동하며 CIDR 서브넷도 지원합니다.

주소가 유효한지 확인

    String str = "1.2.3.4";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

적합한 정규식을 작성하고 이에 대해 유효성을 검사하십시오. JVM은 정규식을 완벽하게 지원합니다.


이를 달성하는 방법은 여러 가지가 있지만 정규 표현식이 더 효율적입니다.

아래 코드를보십시오.

public static void main(String[] args) {

    String ipStr1 = "255.245.188.123"; // valid IP address
    String ipStr2 = "255.245.188.273"; // invalid IP address - 273 is greater than 255

    validateIP(ipStr1);
    validateIP(ipStr2);
}

public static void validateIP(String ipStr) {
    String regex = "\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b";
    System.out.println(ipStr + " is valid? " + Pattern.matches(regex, ipStr));
}

정규식은이 문제를 해결하는 가장 효율적인 방법입니다. 아래 코드를보십시오. 유효성과 함께 자신이 속한 IP 주소 클래스와 예약 된 IP 주소인지 여부도 확인합니다.

Pattern ipPattern;
int[] arr=new int[4];
int i=0;

//Method to check validity
 private String validateIpAddress(String ipAddress) {
      Matcher ipMatcher=ipPattern.matcher(ipAddress);

        //Condition to check input IP format
        if(ipMatcher.matches()) {       

           //Split input IP Address on basis of .
           String[] octate=ipAddress.split("[.]");     
           for(String x:octate) { 

              //Convert String number into integer
              arr[i]=Integer.parseInt(x);             
              i++;
         }

        //Check whether input is Class A IP Address or not
         if(arr[0]<=127) {                          
             if(arr[0]==0||arr[0]==127)
                 return(" is Reserved IP Address of Class A");
             else if(arr[1]==0&&arr[2]==0&&arr[3]==0)
                 return(" is Class A Network address");
             else if(arr[1]==255&&arr[2]==255&&arr[3]==255)
                 return( " is Class A Broadcast address");
             else 
                 return(" is valid IP Address of Class A");
         }

        //Check whether input is Class B IP Address or not
         else if(arr[0]>=128&&arr[0]<=191) {        
             if(arr[2]==0&&arr[3]==0)
                 return(" is Class B Network address");
             else if(arr[2]==255&&arr[3]==255)
                 return(" is Class B Broadcast address");
             else
                 return(" is valid IP Address of Class B");
         }

        //Check whether input is Class C IP Address or not
         else if(arr[0]>=192&&arr[0]<=223) {        
             if(arr[3]==0)
                 return(" is Class C Network address");
             else if(arr[3]==255)
                 return(" is Class C Broadcast address");
             else
                 return( " is valid IP Address of Class C");
        }

        //Check whether input is Class D IP Address or not
        else if(arr[0]>=224&&arr[0]<=239) {          
             return(" is Class D IP Address Reserved for multicasting");
        }

        //Execute if input is Class E IP Address
        else  {                                   
             return(" is Class E IP Address Reserved for Research and Development by DOD");
        }

    }

    //Input not matched with IP Address pattern
    else                                     
        return(" is Invalid IP Address");


}


public static void main(String[] args) {

    Scanner scan= new Scanner(System.in);
    System.out.println("Enter IP Address: ");

    //Input IP Address from user
    String ipAddress=scan.nextLine();  
    scan.close();
    IPAddress obj=new IPAddress();

    //Regex for IP Address
    obj.ipPattern=Pattern.compile("((([0-1]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([0-1]?\\d\\d?|2[0-4]\\d|25[0-5]))");

    //Display output
    System.out.println(ipAddress+ obj.validateIpAddress(ipAddress));

}

sun.net.util 에있는 IPAddressUtil OOTB 클래스를 살펴보십시오 . 도움이 될 것입니다.


범위에 신경 쓰지 않는다면 다음 표현식이 1.1.1.1에서 999.999.999.999까지의 유효성을 검사하는 데 유용합니다.

"[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}"

public static boolean isIpv4(String ipAddress) {
    if (ipAddress == null) {
        return false;
    }
    String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
    Pattern pattern = Pattern.compile(ip);
    Matcher matcher = pattern.matcher(ipAddress);
    return matcher.matches();
}

정규식을 사용하여 유효한 IP 주소를 두 줄로 가져옵니다. 숫자 범위를 얻기 위해 정규식이 어떻게 작동하는지 코드의 주석 세션을 확인하십시오.

public class regexTest {


    public static void main(String[] args) {
        String IP = "255.001.001.255";
        System.out.println(IP.matches(new MyRegex().pattern));
    }

    }

    /*
    * /d - stands for any number between 0 to 9
    * /d{1,2} - preceding number that 0 to 9 here , can be of 1 digit to 2 digit . so minimum 0 and maximum 99
    * |  this stands for or operator
    *
    * () this is applied on a group to get the single value of outcome
    * (0|1)\d{2} = first digit is either 0 or 1 and other two digits can be any number between ( 0 to 9)
    * 2[0-4]\d - first digit is 2 , second digit can be between 0 to 4 and last digit can be 0 to 9
    * 25[0-5] - first two digit will be 25 and last digit will be between 0 to 5
    *
    * */
    class MyRegex {

        String zeroTo255 = "(\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5])";
        public String pattern =  zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;;

    }

public void setIpAddress(String ipAddress) {
        if(ipAddress.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"))   //regular expression for ipv4 
            this.ipAddress = ipAddress;
        else
            System.out.println("incorrect IpAddress");
    }

참고 URL : https://stackoverflow.com/questions/5667371/validate-ipv4-address-in-java

반응형