Pregunta

¿Cómo puedo determinar si una cadena es una dirección IP?Ya sea IPv4 o IPv6?

¿Cuál es el menor y el mayor número de caracteres?

Supongo que esto sería un regex respuesta.

¿Fue útil?

Solución

Pero la cuestión no es tan simple como asumir a.b.c.d ... hay más formas de lo que se dio cuenta.

Pero sin duda esta es una de Google para que pregunta?Bastante cada regex imprimación se puede encontrar en cualquier lugar usa la propiedad intelectual como un ejemplo! ipv4 + regex las puntuaciones de 183,000 éxitos!

Otros consejos

He hecho esto antes, pero me gusta Raymond Chen post en:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

En el que básicamente defensores de uso de expresiones regulares para lo que es buena:analizar las fichas.Luego de evaluar los resultados.Su ejemplo:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

Es mucho más fácil observar y asimilar lo que se supone que debe hacer.

En .NETA hay una IPAddress el tipo que tiene un método práctico TryParse.

Ejemplo:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

Para IPv4 puede utilizar esta expresión regular.

\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

Se ve bastante complejo, pero funciona mediante la limitación de cada uno de los quad a los números de 0 a 255.

@unsliced:cierto, este problema puede conseguir un poco loco.

Si usted realmente necesita para manejar cualquier posible dirección IP, entonces usted tendrá que armar algo más sofisticado.

Sin embargo, si usted sólo quiere hacer la validación básica para asegurarse de que los usuarios están entrando de datos formateados correctamente, creo que es justo para restringir a la una.b.c.el modelo d con las anteriores expresiones regulares.

@unsliced que es correcto, pero por supuesto, dependerá de la aplicación, si usted analiza una dirección IP de un usuario que visita su sitio, entonces tu estás bien usar regex como DEBE ser en x.x.x.x x formato.

Para IPv6 puede utilizar este

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

sin embargo no captura todo porque con IPv6 es mucho más complicado, de acuerdo a la wikipedia, todos los ejemplos siguientes son técnicamente correcta, sin embargo la expresión anterior sólo se captura con un *

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

Ya que la mitad de los que regex maneja el hecho de que el último segmento no tiene un período en el final, se podría cortar por la mitad si tack un '.' al final de su posible dirección IP.

Algo como esto:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

IPv4 se convierte en: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

No estoy seguro acerca de IPv6 reglas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top