2010-06-24 29 views

Respuesta

18

Entiendo que puede ser forzado para usar un regex. Sin embargo, si es posible, es mejor evitar el uso de expresiones regulares para esta tarea y utilizar una clase de biblioteca Java para realizar la validación.

Si desea hacer la validación y la búsqueda DNS juntas, entonces InetAddress.getByName(String) es una buena opción. Esto hará frente a DNS, IPv4 e IPv6 de una sola vez, y le devolverá una instancia cuidadosamente envuelta InetAddress que contiene el nombre DNS (si se proporciona) y la dirección IPv4 o IPv6.

Si solo quiere hacer una validación sintáctica, Apache commons tiene un par de clases que deberían hacer el trabajo: DomainValidator y InetAddressValidator.

+0

¡Gracias, esas clases de Apache deberían hacer el truco! – ljbade

+0

Lamentablemente arroja una excepción simplemente porque un host no existe, no solo cuando el host no es válido. – Trejkaz

+0

@Trejkaz - ¿de qué "está hablando? ¿Has probado el enfoque alternativo también? –

5

Guava tiene una nueva clase HostSpecifier. Incluso validará que el nombre de host (si es un nombre de host) termina en un "sufijo público" válido (por ejemplo, ".com", ".co.uk", etc.), basado en el último sufijo público de mozilla lista. ¡Eso es algo que NO querrías intentar con un regex hecho a mano!

+0

No me gustaría confiar en el código que también ha tomado una instantánea de la "última" lista de sufijos públicos, porque un par de meses más tarde no será la última. – Trejkaz

0

Inspirado por el código que encontré en this post, creé el siguiente método de validador que parece satisfacer bastante bien las necesidades de validación simples. Al leer JavaDoc de URI eliminé algunos falsos positivos como "host: 80" y "hostname/page", pero no puedo garantizar que falten algunos positivos.

public static boolean isValidHostNameSyntax(String candidateHost) { 
    if (candidateHost.contains("/")) { 
     return false; 
    } 
    try { 
     // WORKAROUND: add any scheme and port to make the resulting URI valid 
     return new URI("my://[email protected]" + candidateHost + ":80").getHost() != null; 
    } catch (URISyntaxException e) { 
     return false; 
    } 
} 
Cuestiones relacionadas