web-dev-qa-db-ja.com

JavaでIPv4アドレスを検証する

Javaを使用してIPv4アドレスを検証したい。 ドット10進表記 を使用して記述する必要があるため、3つのドット( ". ")、文字、ドットの間の数字、および数字は有効な範囲内にありません。どのように行うべきですか?

57
iRunner

正規表現を使用すると非常に簡単です(ただし、これは、Apache Commons Utilityを使用する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();
}

投稿に基づく Mkyong

87
Necronet

InetAddressValidatorユーティリティクラスを試してください。

ここのドキュメント:

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

ここからダウンロード:

http://commons.Apache.org/validator/

51
worpet

Guava を使用します

InetAddresses.isInetAddress(ipStr)
20
wileyquixote

次のような正規表現を使用できます。

_(([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()呼び出しを配置し​​て、1回だけ実行されるようにするのが最善です。

9
mdma

この機能を使用できます-

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);
}
8
Akarshit Wal

また、文書化されていないユーティリティクラスSun.net.util.IPAddressUtil、これは 実際には使用しないでください ですが、簡単な使い捨てユーティリティで役立つ場合があります。

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);

内部的には、これはInetAddressがIPアドレスの解析に使用するユーティリティクラスです。

これは、技術的には 有効なIPv4アドレス である「123」などの文字列に対してtrueを返すことに注意してください。ドット10進表記ではありません。

7
Jason C

これは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;
    }
}
3
Pian0_M4n

The IPAddress Java library はそれを行います。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
    }
2
Sean F

IP4の場合、次のように正規表現を使用できます。

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

2
khachik

それを実現する方法はたくさんありますが、正規表現はより効率的です。

以下のコードを見てください:

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));
}
1
Mulalo Madida

適切な正規表現を作成し、それに対して検証します。 JVMは正規表現を完全にサポートしています。

正規表現は、この問題を解決する最も効率的な方法です。以下のコードを見てください。有効性に沿って、それが属する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));

}
1
Deepali Agg

をご覧ください IPAddressUtil OOTBクラスは Sun.net.util 、それはあなたを助けるはずです。

0
Girish
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();
}
0
veeson

正規表現を使用して2行で有効な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;;

    }
0
Arpan Saini

範囲を気にしない場合、次の式は1.1.1.1から999.999.999.999までの検証に役立ちます

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