regex - letras - expresiones regulares java
¿Qué es una expresión regular que coincidirá con un nombre de dominio válido sin un subdominio? (16)
En primer lugar, perdón por la 10.000ª pregunta de RegEx,
Me doy cuenta de que hay otras preguntas relacionadas con el dominio, pero la expresión regular no funciona correctamente, es demasiado compleja o para URL con subdominios, protocolos y rutas de archivos.
El mío es más simple, necesito validar un nombre de dominio:
google.com
stackoverflow.com
Entonces, un dominio en su forma más pura, ni siquiera un subdominio como www.
- Los personajes solo deben ser az | AZ | 0-9 y punto (.) Y punto (-)
- La parte del nombre de dominio no debe comenzar ni finalizar con el guión (-) (por ejemplo, -google-.com)
- La parte del nombre de dominio debe tener entre 1 y 63 caracteres de longitud
-
La extensión (TLD) puede ser cualquier cosa bajo reglas # 1 por ahora, puedo validarlas contra una lista más adelante, debería ser de 1 o más caracteres, aunque
Editar: TLD es aparentemente 2-6 caracteres tal como está
no. 4 revisado: TLD debe etiquetarse como "subdominio" ya que debe incluir cosas como .co.uk - Me imagino que la única validación posible (aparte de verificar contra una lista) sería ''después del primer punto debería haber uno o más personajes según las reglas n. ° 1
Muchas gracias, créanme, lo intenté!
^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $
Ejemplos que funcionan:
stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com
También funcionará para extensiones
.com.uk
.co.in
.uk.edu.in
Ejemplos que no funcionarán:
-stack.com
funcionará incluso con la extensión de dominio más larga ".versicherung"
Esta respuesta es para nombres de dominio (incluidos los RR de servicio), no nombres de host (como un nombre de host de correo electrónico).
^(?=.{1,253}/.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:/.|$)){2,}$
Es básicamente la respuesta de mkyong y además:
- Longitud máxima de 255 octetos, incluidos los prefijos de longitud y la raíz nula.
- Permitir el seguimiento ''.'' para la raíz dns explícita.
- Permitir ''_'' principal para los RR de dominio de servicio, (errores: no aplica 15 caracteres máx. Para etiquetas _ ni requiere al menos un dominio por encima de los RR del servicio)
- Coincide con todos los TLD posibles.
- No captura etiquetas de subdominio.
Por partes
Lookahead, límite máximo de longitud entre ^ $ a 253 caracteres con literal final opcional ''.''
(?=.{1,253}/.?$)
Lookahead, el siguiente caracter no es ''-'' y no ''_'' sigue a ningún caracter antes del siguiente ''.''. Es decir, hacer cumplir que el primer carácter de una etiqueta no es ''-'' y que solo el primer carácter puede ser ''_''.
(?!-|[^.]+_)
Entre 1 y 63 de los caracteres permitidos por etiqueta.
[A-Za-z0-9-_]{1,63}
Lookbehind, personaje anterior no ''-''. Es decir, hacer cumplir que el último carácter de una etiqueta no es un ''-''.
(?<!-)
Forzar un ''.'' al final de cada etiqueta, excepto la última, donde es opcional.
(?:/.|$)
Mayormente combinado desde arriba, esto requiere al menos dos niveles de dominio, lo cual no es del todo correcto, pero generalmente es una suposición razonable. Cambie de {2,} a + si desea permitir dominios de nivel superior (TLD) o subdominios relativos no calificados (por ejemplo, localhost, myrouter, a).
(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:/.|$)){2,}
Unidad de pruebas para esta expresión.
Aquí está el código completo con un ejemplo:
<?php
function is_domain($url)
{
$parse = parse_url($url);
if (isset($parse[''host''])) {
$domain = $parse[''host''];
} else {
$domain = $url;
}
return preg_match(''/^(?!/-)(?:[a-zA-Z/d/-]{0,62}[a-zA-Z/d]/.){1,126}(?!/d+)[a-zA-Z/d]{1,63}$/'', $domain);
}
echo is_domain(''example.com''); //true
echo is_domain(''https://example.com''); //true
echo is_domain(''https://.example.com''); //false
echo is_domain(''https://localhost''); //false
Bueno, es bastante sencillo un poco más furtivo de lo que parece (ver comentarios), dados sus requisitos específicos:
/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]/.[a-zA-Z]{2,}$/
Pero tenga en cuenta que esto rechazará una gran cantidad de dominios válidos.
Gracias por indicar la dirección correcta en soluciones de validación de nombres de dominio en otras respuestas. Los nombres de dominio se pueden validar de varias maneras.
Si necesita validar el dominio de IDN en su forma legible , regex /p{L}
lo ayudará. Esto permite hacer coincidir cualquier personaje en cualquier idioma.
¡Tenga en cuenta que la última parte también puede contener guiones ! Como los nombres Chineese codificados con punycode pueden tener caracteres unicode en tld.
He llegado a una solución que coincidirá, por ejemplo:
- google.com
- masełkowski.pl
- maselkowski.pl
- m.maselkowski.pl
- www.masełkowski.pl.com
- xn--masekowski-d0b.pl
- 中国 互联 心 中 中心. 中国
- xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s
Regex es:
^[0-9/p{L}][0-9/p{L}-/.]{1,61}[0-9/p{L}]/.[0-9/p{L}][/p{L}-]*[0-9/p{L}]+$
NOTA: Esta expresión regular es bastante permisiva, al igual que los nombres de dominio actuales permitidos.
ACTUALIZACIÓN : Aún más simplificado, ya que a-aA-Z/p{L}
es lo mismo que simplemente /p{L}
NOTA 2: El único problema es que coincidirá con dominios con puntos dobles ..., como masełk..owski.pl
. Si alguien sabe cómo solucionar esto, por favor mejore.
La respuesta aceptada no funciona para mí, prueba esto:
^ ((?! -) [A-Za-z0-9 -] {1,63} (? <! -) /.) + [A-Za-z] {2,6} $
Visite estos Casos de prueba unitarios para validación.
Mi RegEx es el siguiente:
^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}/.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}/.[a-zA-Z]{2,3})$
está bien para i.oh1.me y para wow.british-library.uk
UPD
Aquí está la regla actualizada
^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))/.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}/.[a-zA-Z]{2,3})$
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
ahora comprueba -
o _
en el principio o el final de la etiqueta del dominio.
No hay suficientes representantes para comentar. En respuesta a la solución de Paka, descubrí que necesitaba ajustar tres elementos:
- El guión y el guión bajo se movieron debido a que el guión se interpreta como un rango (como en "0-9")
- Se agregó un punto y aparte para los nombres de dominio con muchos subdominios
- Extendió la duración potencial de los TLD a 13
Antes de:
^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))/.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}/.[a-zA-Z]{2,3})$
Después:
^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_/.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))/.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}/.[a-zA-Z]{2,3})$
Para nuevos gTLD
/^((?!-)[/p{L}/p{N}-]+(?<!-)/.)+[/p{L}/p{N}]{2,}$/iu
Sé que esta es una publicación un poco antigua, pero a todas las expresiones regulares aquí les falta un componente muy importante: el soporte para nombres de dominio IDN.
Los nombres de dominio IDN comienzan con xn--. Permiten caracteres UTF-8 extendidos en nombres de dominio. Por ejemplo, ¿sabías que "♡ .com" es un nombre de dominio válido? Sí, "corazón de amor punto com"! Para validar el nombre de dominio, debe permitir que http://xn--c6h.com/ apruebe la validación.
Tenga en cuenta que para usar esta expresión regular, deberá convertir el dominio a minúsculas y también usar una biblioteca IDN para asegurarse de codificar los nombres de dominio en ACE (también conocido como "Codificación compatible con ASCII"). Una buena biblioteca es GNU-Libidn.
idn (1) es la interfaz de línea de comando para la biblioteca de nombres de dominio internacionalizados. El siguiente ejemplo convierte el nombre de host en UTF-8 en codificación ACE. La URL resultante https://nic.xn--flw351e/ se puede usar como equivalente codificado en ACE de https://nic.xn--flw351e/ .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Esta expresión regular mágica debería abarcar la mayoría de los dominios (aunque, estoy seguro de que hay muchos casos de borde válidos que me he perdido):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}/.(xn--)?([a-z0-9/-]{1,61}|[a-z0-9-]{1,30}/.[a-z]{2,})$
Al elegir una expresión regular de validación de dominio, debería ver si el dominio coincide con lo siguiente:
- xn--.com
- .xn - com
- .co.uk
Si estos tres dominios no pasan, ¡es posible que su expresión regular no permita dominios legítimos!
Consulte la página de Soporte de nombres de dominio internacionalizados de la Guía del entorno de idiomas internacionales de Oracle para obtener más información.
Siéntase libre de probar la expresión regular aquí: http://www.regexr.com/3abjr
ICANN mantiene una lista de tlds que se han delegado, que se pueden usar para ver algunos ejemplos de dominios IDN.
Editar:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}/.)*(xn--)?([a-z0-9/-]{1,61}|[a-z0-9-]{1,30}/.[a-z]{2,})$
Esta expresión regular detendrá los dominios que tienen ''-'' al final de un nombre de host como marcado como válido. Además, permite subdominios ilimitados.
Solo una pequeña corrección: la última parte debería ser hasta 6. Por lo tanto,
^[a-z0-9]+([/-/.]{1}[a-z0-9]+)*/.[a-z]{2,6}$
El TLD más largo es el museum
(6 caracteres) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Mi apuesta:
^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?/.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$
Explicado:
El nombre de dominio se crea a partir de segmentos. Aquí hay un segmento (excepto el final):
[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?
Puede tener 1-63 caracteres, no comienza o termina con ''-''.
Ahora agregue ''.'' y repetir al menos una vez:
(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?/.)+
Luego adjunte el segmento final, que tiene de 2 a 63 caracteres de longitud:
[a-z0-9][a-z0-9-]{0,61}[a-z0-9]
Pruébelo aquí: http://regexr.com/3au3g
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))/.)+[a-zA-Z]{2,6}$/
([a-zA-Z]{1,2})
-> por aceptar solo dos caracteres.([0-9]{1,2})
-> por aceptar solo dos números
si algo excede más allá de dos ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
esta expresión regular se encargará de eso.
Si queremos hacer la coincidencia por lo menos una vez, se usará.
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)/.)+[A-Za-z]{2,253})$
Gracias @mkyong por la base de mi respuesta. Lo he modificado para admitir etiquetas más largas aceptables.
Además, "localhost" es técnicamente un nombre de dominio válido. Modificaré esta respuesta para acomodar nombres de dominio internacionalizados.
^[a-z0-9]+([/-/.]{1}[a-z0-9]+)*/.[a-z]{2,7}$
[dominio - minúsculas y 0-9 solamente] [puede tener un guión] + [TLD - minúsculas solamente, debe tener entre 2 y 7 letras]
http://rubular.com/ es brillante para probar expresiones regulares!
Editar: Máximo de TLD actualizado a 7 caracteres para ''.rentals'' como señaló Dan Caddigan.
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]/.[a-zA-Z]+(/.[a-zA-Z]+)$