Javaを使用してIPv4アドレスを検証したい。 ドット10進表記 を使用して記述する必要があるため、3つのドット( ".
")、文字、ドットの間の数字、および数字は有効な範囲内にありません。どのように行うべきですか?
正規表現を使用すると非常に簡単です(ただし、これは、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
InetAddressValidatorユーティリティクラスを試してください。
ここのドキュメント:
ここからダウンロード:
Guava を使用します
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()
呼び出しを配置して、1回だけ実行されるようにするのが最善です。
この機能を使用できます-
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);
}
また、文書化されていないユーティリティクラスSun.net.util.IPAddressUtil
、これは 実際には使用しないでください ですが、簡単な使い捨てユーティリティで役立つ場合があります。
boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
内部的には、これはInetAddress
がIPアドレスの解析に使用するユーティリティクラスです。
これは、技術的には 有効なIPv4アドレス である「123」などの文字列に対してtrueを返すことに注意してください。ドット10進表記ではありません。
これは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;
}
}
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
}
IP4の場合、次のように正規表現を使用できます。
^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\.){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$
。
それを実現する方法はたくさんありますが、正規表現はより効率的です。
以下のコードを見てください:
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));
}
適切な正規表現を作成し、それに対して検証します。 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));
}
をご覧ください IPAddressUtil OOTBクラスは Sun.net.util 、それはあなたを助けるはずです。
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();
}
正規表現を使用して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;;
}
範囲を気にしない場合、次の式は1.1.1.1から999.999.999.999までの検証に役立ちます
"[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}"