Tengo problemas para escribir una expresión regular que coincida con direcciones IPv6 válidas, incluidas aquellas en su forma comprimida (con ::
ceros a la izquierda o omitidos de cada par de bytes).
¿Alguien puede sugerir una expresión regular que cumpla con el requisito?
Estoy considerando expandir cada par de bytes y hacer coincidir el resultado con una expresión regular más simple.
regex
networking
ipv6
Solo lectura
fuente
fuente
Respuestas:
No pude hacer que la respuesta de @Factor Mystic funcionara con expresiones regulares POSIX, así que escribí una que funciona con expresiones regulares POSIX y expresiones regulares PERL.
Debería coincidir:
Expresión regular de IPv6:
Para facilitar la lectura, lo siguiente es la expresión regular anterior dividida en los puntos OR principales en líneas separadas:
Para facilitar la comprensión de lo anterior, el siguiente código "pseudo" replica lo anterior:
Publiqué un script en GitHub que prueba la expresión regular: https://gist.github.com/syzdek/6086792
fuente
127.000.000.001
fe80
donde debería ser algo como[fF][eE]80
y unffff
que debería ser algo así[fF]{4}
Lo siguiente validará las direcciones IPv4, IPv6 (completa y comprimida) e IPv6v4 (completa y comprimida):
fuente
Parece que puede estar usando Python. Si es así, puede usar algo como esto:
No creo que tenga que tener IPv6 compilado en Python para obtener
inet_pton
, que también puede analizar direcciones IPv4 si pasasocket.AF_INET
como el primer parámetro. Nota: es posible que esto no funcione en sistemas que no sean Unix.fuente
except
cláusula. De lo contrario,except
detectará todo y puede enmascarar errores no relacionados. El tipo aquí debería sersocket.error
.Desde " IPv6 regex ":
fuente
Tendría que apoyar firmemente la respuesta de Frank Krueger .
Si bien dice que necesita una expresión regular para que coincida con una dirección IPv6, supongo que lo que realmente necesita es poder verificar si una cadena determinada es una dirección IPv6 válida. Aquí hay una distinción sutil pero importante.
Hay más de una forma de verificar si una cadena dada es una dirección IPv6 válida y la coincidencia de expresiones regulares es solo una solución.
Utilice una biblioteca existente si puede. La biblioteca tendrá menos errores y su uso resultará en menos código para mantener.
La expresión regular sugerida por Factor Mystic es larga y compleja. Lo más probable es que funcione, pero también debe considerar cómo se las arreglaría si fallara inesperadamente. El punto que trato de señalar aquí es que si no puede formar una expresión regular requerida usted mismo, no podrá depurarla fácilmente.
Si no tiene una biblioteca adecuada, puede ser mejor escribir su propia rutina de validación de IPv6 que no dependa de expresiones regulares. Si lo escribes lo entiendes y si lo entiendes puedes agregar comentarios para explicarlo para que otros también puedan entenderlo y posteriormente mantenerlo.
Actúe con precaución cuando utilice una expresión regular cuya funcionalidad no pueda explicar a otra persona.
fuente
return ex1.match(S) && ! ex2.match(S)
).No soy un experto en Ipv6, pero creo que puedes obtener un resultado bastante bueno más fácilmente con este:
para responder "es un ipv6 válido", me parece que está bien. Para dividirlo en partes ... olvídalo. He omitido el no especificado (: :) ya que no sirve de nada tener una "dirección no especificada" en mi base de datos.
el principio:
^([0-9A-Fa-f]{0,4}:){2,7}
<- coincide con la parte comprimible, podemos traducir esto como: entre 2 y 7 dos puntos que pueden tener un número hexadecimal entre ellos.seguido de:
[0-9A-Fa-f]{1,4}$
<- un número hexadecimal (0 a la((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
izquierda omitido) O <- una dirección Ipv4fuente
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Esto también detecta el loopback (:: 1) y las direcciones ipv6. cambió {} a + y puso: dentro del primer corchete.
probado con ifconfig -a salida http://regexr.com/
La opción o terminal de Unix o Mac OSx devuelve solo la salida coincidente (ipv6) que incluye :: 1
Obtenga todas las direcciones IP (IPv4 o IPv6) e imprima la coincidencia en un término de Unix OSx
fuente
ip a | grep -Po '[\w:]+:+[\w:]+'
Esta expresión regular coincidirá con las direcciones IPv6 e IPv4 válidas de acuerdo con la implementación GNU C ++ de expresiones regulares con el modo REGULAR EXTENDED utilizado:
fuente
¡Tener cuidado! En Java, el uso de InetAddress y clases relacionadas (Inet4Address, Inet6Address, URL) puede involucrar tráfico de red. Por ejemplo, resolución de DNS (URL.equals, InetAddress de la cadena). ¡Esta llamada puede tardar mucho y se está bloqueando!
Para IPv6 tengo algo como esto. Por supuesto, esto no maneja los detalles muy sutiles de IPv6 como que los índices de zona están permitidos solo en algunas clases de direcciones IPv6. Y esta expresión regular no está escrita para la captura de grupos, es solo un tipo de expresión regular de "coincidencias".
S
- Segmento IPv6 =[0-9a-f]{1,4}
I
- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})
Esquema (la primera parte coincide con las direcciones IPv6 con el sufijo IPv4, la segunda parte coincide con las direcciones IPv6, la última parte es el índice de la zona):
Y aquí la expresión regular might (no distingue entre mayúsculas y minúsculas, rodee con lo que sea necesario como principio / final de línea, etc.):
fuente
La siguiente expresión regular es solo para IPv6. El grupo 1 coincide con la IP.
fuente
Una expresión regular simple que coincidirá, pero no recomendaría para la validación de ningún tipo es esta:
Tenga en cuenta que esto coincide con la compresión en cualquier lugar de la dirección, aunque no coincidirá con la dirección de loopback :: 1. Considero que esto es un compromiso razonable para mantener la expresión regular simple.
Utilizo con éxito esto en las reglas de selección inteligente iTerm2 para hacer cuatro clics en direcciones IPv6.
fuente
A-F
noA-Z
! También tenga en cuenta que está excluyendo la notación de cuatro puntos.Si usa Perl, intente Net :: IPv6Addr
NetAddr :: IP
Validar :: IP
fuente
En Scala use los conocidos validadores de Apache Commons.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
Siguiendo las pruebas del método
ip(ip: String)
:fuente
1200:0000:AB00:1234:0000:2552:7777:1313
es un formato válido para una dirección IPv6, pero no es una dirección IPv6 válida como devuelve el método de prueba. Apuesto a que cree que241.54.113.65
es una dirección IPv4 válida.Al observar los patrones incluidos en las otras respuestas, hay una serie de buenos patrones que se pueden mejorar haciendo referencia a grupos y utilizando búsquedas anticipadas. Aquí hay un ejemplo de un patrón que hace referencia a sí mismo que utilizaría en PHP si tuviera que hacerlo:
Nota: PHP tiene un filtro incorporado para esto, que sería una mejor solución que este patrón.
Análisis Regex101
fuente
Genere lo siguiente usando python y funciona con el módulo re. Las afirmaciones de anticipación garantizan que aparezca el número correcto de puntos o dos puntos en la dirección. No es compatible con IPv4 en notación IPv6.
fuente
Las expresiones regulares para ipv6 pueden ser realmente complicadas cuando se consideran direcciones con ipv4 incrustado y direcciones que están comprimidas, como puede ver en algunas de estas respuestas.
La biblioteca Java IPAddress de código abierto validará todas las representaciones estándar de IPv6 e IPv4 y también admite la longitud del prefijo (y la validación de las mismas). Descargo de responsabilidad: soy el gerente de proyecto de esa biblioteca.
Ejemplo de código:
fuente
En Java, puede usar la clase de biblioteca
sun.net.util.IPAddressUtil
:fuente
Es difícil encontrar una expresión regular que funcione para todos los casos de IPv6. Por lo general, son difíciles de mantener, no son fáciles de leer y pueden causar problemas de rendimiento. Por lo tanto, quiero compartir una solución alternativa que he desarrollado: Expresión regular (RegEx) para IPv6 separada de IPv4
Ahora puede preguntar: "Este método solo encuentra IPv6, ¿cómo puedo encontrar IPv6 en un texto o archivo?" Aquí también hay métodos para este problema.
Nota : Si no desea utilizar la clase IPAddress en .NET, también puede reemplazarla con mi método . También cubre IPv4 mapeado y casos especiales, mientras que IPAddress no cubre.
fuente
InetAddressUtils
tiene todos los patrones definidos. Terminé usando su patrón directamente y lo pego aquí como referencia:fuente
¿Estás usando Ruby? Prueba esto:
fuente
Según sus necesidades, una aproximación como:
puede ser suficiente (como con grepping simple de archivos de registro, por ejemplo).
fuente
Para usuarios de PHP 5.2+
filter_var
funciona muy bien.Sé que esto no responde a la pregunta original (específicamente una solución de expresiones regulares), pero publico esto con la esperanza de que pueda ayudar a alguien más en el futuro.
fuente
Esto funcionará para IPv4 e IPv6:
fuente
::
. por ejemplo2404:6800::4003:c02::8a
Esto es lo que se me ocurrió, usando un poco de anticipación y grupos con nombre. Por supuesto, esto es solo IPv6, pero no debería interferir con patrones adicionales si desea agregar IPv4:
fuente
Puede utilizar las herramientas de shell ipextract que hice para este propósito. Están basados en regexp y grep.
Uso:
fuente
Simplemente haciendo coincidir los locales de un origen con corchetes incluidos. Sé que no es tan completo, pero en javascript los otros tenían problemas para rastrear principalmente el de no funcionar, por lo que parece que esto me da lo que necesitaba por ahora. Tampoco se necesitan AF mayúsculas adicionales.
La versión de Jinnko está simplificada y veo mejor.
fuente
Como se indicó anteriormente, otra forma de obtener un analizador de validación de representación textual IPv6 es mediante programación. Aquí hay uno que es totalmente compatible con RFC-4291 y RFC-5952. Escribí este código en ANSI C (funciona con GCC, pasé las pruebas en Linux, funciona con clang, pasé las pruebas en FreeBSD). Por lo tanto, solo se basa en la biblioteca estándar ANSI C, por lo que se puede compilar en todas partes (lo he usado para analizar IPv6 dentro de un módulo del kernel con FreeBSD).
fuente
Prueba este pequeño de una sola línea. Solo debe coincidir con direcciones IPv6 comprimidas / sin comprimir válidas (no híbridos IPv4)
fuente
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 octales.
Sugiero usarlo
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
como segmento IPv4.fuente
Si solo desea IP-s normales (sin barras), aquí:
Lo uso para mi marcador de sintaxis en la aplicación de edición de archivos de hosts. Funciona como encanto.
fuente