Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

101
Vistas
Cómo combinar estos 2 Regexp en Javascript

Escribí una rutina de Javascript que, dado un nombre de host o una URL, encuentra el dominio raíz .

 function getRootDomain(s){ var sResult = '' try { sResult = s.match(/^(?:.*\:\/?\/)?(?<domain>[\w\-\.]*)/).groups.domain .match(/(?<root>[\w\-]*(\.\w{3,}|\.\w{2}|\.\w{2}\.\w{2}))$/).groups.root; } catch(ignore) {} return sResult; }

¿Cuál es la técnica para combinar las dos reglas de expresiones regulares en una regla?

Utilicé este tutorial para tratar de mejorar mi experiencia existente de RegExp a lo largo de los años, aunque nunca entendí realmente mirar hacia atrás y mirar hacia adelante (¿qué podría ser útil aquí?), y luego usé la gran herramienta en RegEx101.com para prueba y error. Lo que intenté fue pegar lo que está después de <root> para reemplazar lo que viene después de <domain> , y variaciones de eso, y todo falló.

Un conjunto de prueba para usar con una herramienta como RegEx101 podría ser:

 https://test.com:8080/?id=4&re=3 https://test-test.com:8080/?id=4&re=3 https://data.test.com:8080/?id=4&re=3 https://data.test.com/?id=4&re=3 https://data.test.com/ https://data.test.com#testing https://data.test.com/#testing https://data.test.com:8080/#testing https://data.test.com:8080#testing https://data.tester.com/ https://data-test.test.com/ https://test.com https://test.com#testing https://test.com/ https://test.am/?id=4 https://test.com?id=3&re=3 https://test.com/?id=3&re=3 https://megatest.com/?id=3&re=3 test.com data.test.co.uk test.co data.test.com data.tester-test.com data-test.tester-test.com tester-test.com about:blank
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

La segunda expresión regular usa la aserción $ para coincidir solo con el final de la captura de .domain .

Sin embargo, la primera RegExp deja de coincidir después del dominio (cuando se encuentra con un / , un ? , un # , un : o el final de la cadena si no hay ruta, cadena de consulta o partes hash. Por lo tanto, no puede simplemente reutilice la aserción $ , fallaría en algunos casos.

Para combinar ambas partes, podría reemplazar la captura de domain con esto:

.*?(?<root>[\w\-]*(\.\w{3,}|\.\w{2}|\.\w{2}\.\w{2}))(?:[\/?#:]|$)

(?:[\/?#]|$) al final es un grupo que no captura que coincide con los caracteres de destino o con el final de la cadena.

.*? combina frugalmente con cualquier cosa. Es decir, primero intenta hacer coincidir la captura root seguida de (?:[\/?#]|$) . Cada vez que falla, come un carácter y vuelve a intentarlo, lo que le permite buscar la root .

También:

  • puede combinar \.\w{3,}|\.\w{2} en solo \.\w{2,} .

  • puede usar un grupo que no captura alrededor de los TLD ( (?:...) vs (...) .

  • Sería mejor usar .*? para obtener el protocolo, o podría terminar englobándose demasiado (con un .* codicioso, pasar https://example.com/#://bar.com devolvería bar.com ).

  • No necesita escapar de : . En modo Unicode, ese escape es en realidad un error de sintaxis.

resultando en

 const x = /^(?:.*?:\/\/)?.*?(?<root>[\w\-]*(?:\.\w{2,}|\.\w{2}\.\w{2}))(?:[\/?#:]|$)/

De hecho, escribí un generador RegExp que puede ayudarlo a avanzar en su viaje de aprendizaje RegExp... Aquí está su RegExp portado a compose-regexp

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda