Validar la dirección IPv4 en Java

Quiero validar una dirección IPv4 usando Java. Debe escribirse usando la notación de punto decimal , por lo que debe tener 3 puntos (” . “), Sin caracteres, números entre los puntos y los números deben estar en un rango válido. ¿Cómo deberia hacerse?

Bastante simple con Regular Expression (pero tenga en cuenta que esto es mucho menos eficiente y mucho más difícil de leer que la respuesta de Worpet que utiliza una Utilidad de Apache Commons)

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

Basado en el mensaje Mkyong

Utilice InetAddresses.forString () de Guava

 try { InetAddresses.forString(ipStr); } catch (IllegalArgumentException e) { ... } 

Puedes usar una expresión regular, como esta:

 (([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])) 

Este valida los valores están dentro del rango.

Android tiene soporte para expresiones regulares. Ver 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(); } } 

Para evitar volver a comstackr el patrón una y otra vez, es mejor colocar la llamada Pattern.compile() para que se ejecute solo una vez.

También hay una clase de utilidad indocumentada sun.net.util.IPAddressUtil , que no debería usar en realidad , aunque podría ser útil en una utilidad sun.net.util.IPAddressUtil e sun.net.util.IPAddressUtil :

 boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString); 

Internamente, esta es la clase de utilidad que InetAddress utiliza para analizar las direcciones IP.

Tenga en cuenta que esto volverá a ser verdadero para cadenas como “123”, que técnicamente son direcciones IPv4 válidas , pero no en notación decimal de puntos.

Puedes usar esta función –

 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); } 

Esto es para Android, prueba para IPv4 e IPv6

Nota: el uso habitual de InetAddressUtils está en desuso. Use las nuevas clases de 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; } } 

Si es IP4, puede usar una expresión regular de la siguiente manera:

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

La biblioteca Java de IPAddress lo hará. El javadoc está disponible en el enlace. Descargo de responsabilidad: soy el gerente del proyecto.

Esta biblioteca admite IPv4 e IPv6 de forma transparente, por lo que la validación funciona igual debajo, y también admite subredes CIDR.

Verificar si una dirección es válida

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

Escribe una expresión regular adecuada y valídela contra eso. La JVM tiene soporte completo para expresiones regulares.

Si no le importa el rango, la siguiente expresión será útil para validar de 1.1.1.1 a 999.999.999.999

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

Hay muchas maneras de lograr eso, pero la expresión regular es más eficiente.

Mira el código a continuación:

 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)); } 

Eche un vistazo a la clase IPAddressUtil OOTB presente en sun.net.util , que debería ayudarlo.

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

La expresión regular es la forma más eficiente de resolver este problema. Mira el código a continuación. A lo largo de la validez, también verifica la clase de dirección IP a la que pertenece y si es una dirección IP reservada o no.

 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)); } 
    Intereting Posts