2008-09-05 17 views

Respuesta

17
public static final String IPV4_REGEX = "\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z"; 
public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z"; 
public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z"; 
public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z"; 
public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z"; 

Obtuve estos de algunos blog. Alguien bueno con expresiones regulares debería poder generar una expresión regular única para todos los tipos de direcciones IPv6. En realidad, supongo que podrías tener una expresión regular que coincida con IPv4 e IPv6.

+5

Sí, sin duda, alguien debe llegar a una expresión regular única que abarca todo, son muy, muy cortas, como lo son. –

+0

Gracias! Estos son un buen punto de partida. Pero he encontrado que IPV6_HEXCOMPRESSED_REGEX aceptará "1 :: 2: 3: 4: 5: 6: 7: 8", lo cual no es válido ya que no puedes tener más de 8 agrupaciones y :: implica más agrupaciones comprimidas . – gusterlover6

3

Aquí es una expresión regular para que coincida con las direcciones IPv4:

\b(?:(?: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]?)\b 

Tendrá que escapar de las barras invertidas cuando se especifica como una cadena literal en Java:

"\\b(?:(?: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]?)\\b" 
6

Otra buena opción para el procesamiento IPs debe usar las clases de Java Inet4Address y Inet6Address, que pueden ser útiles de varias maneras, una de las cuales es determinar la validez de la dirección IP.

Sé que esto no responde la pregunta directamente, pero creo que vale la pena mencionarla.

0

La expresión regular permite el uso de ceros a la izquierda en las partes de IPv4.

Algunas distribuciones de Unix y Mac convierten esos segmentos en octals.

Sugiero usar 25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d como un segmento IPv4.

0

Regexes para ipv6 puede ser realmente complicado cuando se consideran direcciones con ipv4 incrustado y direcciones que están comprimidas.

The open-source IPAddress Java library validará todas las representaciones estándar de IPv6 e IPv4 y también es compatible con la longitud del prefijo (y la validación de tal). Descargo de responsabilidad: soy el gerente de proyecto de esa biblioteca.

Código ejemplo:

try { 
    IPAddressString str = new IPAddressString("::1"); 
    IPAddress addr = str.toAddress(); 
} catch(AddressStringException e) { 
    //e.getMessage has validation error 
} 
Cuestiones relacionadas