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

205
Vistas
Regex para obtener la región y el idioma de la url /xx/xx en dos grupos

Tengo una estructura de URL donde el primer subdirectorio es la región y luego el segundo opcional es la anulación del idioma:

https://example.com/no/en

Estoy tratando de sacar las dos partes en un grupo cada una. De esta forma, en el JS, puedo hacer lo siguiente para obtener cada parte de la url:

 const pathname = window.location.pathname // '/no/en/mypage' const match = pathname.match('xxx') const region = match[1] // 'no' or '/no' const language = match[2] // 'en' or '/en'

He intentado crear varias expresiones regulares sin suerte en cumplir con todos mis requisitos a continuación: Esto es lo más cerca que he llegado, pero se puede evitar el error debido a que también coincide "/do" de /donotmatch con la siguiente expresión regular:

(\/[az]{2})(\/[az]{2})? El problema con este es que también coincide con casos como /noada . Luego traté de hacer coincidir los dos primeros az y luego seguí con una barra diagonal o sin caracteres como este: (\/[az]{2}\/|[^.])([az]{2}\/|[^.])? Creo que no estoy obteniendo la sintaxis correcta para la parte no.

La expresión regular que estoy tratando de crear tiene que pasar estos criterios para no romperse:

  • /no - partido del grupo 1 (no), grupo 2 indefinido
  • /no/ - partido del grupo 1 (no), grupo 2 indefinido
  • /nona - sin coincidencias
  • /no/en - partido del grupo 1(no), partido del grupo 2(en)
  • /no/en/ - partido del grupo 1(no), partido del grupo 2(en)
  • /no/enen - partido del grupo 1 (no), grupo 2 indefinido
  • /no/en/algo - partido del grupo 1(no), partido del grupo 2(en)
  • /no/en/jp - partido del grupo 1 (no), partido del grupo 2 (en) (no se emparejará jp)

Siento que estoy muy cerca de una solución que funcione, pero todos mis intentos hasta ahora han fallado un poco.

Si la parte del grupo no es posible, supongo que también obtener /xx/xx y luego dividir por / también es una opción.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Siga cada captura con (?=$|/) , que es una mirada hacia adelante para afirmar que lo que sigue es el final de la entrada o una barra inclinada.

 https?://[^/]+/(\w\w)(?=$|/)(?:/(\w\w)(?=$|/))?

Ver demostración en vivo .

La segunda captura está envuelta en un grupo de no captura opcional a través de (?:…)?

Para ser más estricto y permitir solo letras, reemplace \w con [az] pero \w puede ser suficiente para sus necesidades.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar esta expresión regular con un segundo grupo de captura opcional:

 \/(\w{2})(?:\/(\w{2}))?(?:\/|$)

Demostración RegEx

RegEx Explicación:

  • \/ : Empieza el partido /
  • (\w{2}) : Primer grupo de captura para hacer coincidir 2 caracteres de palabra
  • (?:\/(\w{2}))? : Grupo de no captura opcional que comienza con / seguido de un segundo grupo de captura para hacer coincidir 2 caracteres de palabra.
  • (?:\/|$) : Cierre de partida / o final de línea
about 4 years ago · Juan Pablo Isaza Denunciar

0

Acabo de ver esta nueva forma de obtener el mismo resultado usando la nueva API de patrón de URL

La API es bastante nueva como en la redacción de esta respuesta, pero hay un polyfill que puede usar para agregar soporte ahora mismo.

 const pattern = new URLPattern({ pathname: '/:region(\\w{2})/:lang(\\w{2})?' }) const result = pattern.exec('https://example.com/no/en')?.pathname?.groups const region = result?.region // no or undefined const lang = result?.lang // en or undefined

Resolviendo el problema con la barra inclinada final, uno podría reemplazar las barras con nada antes de enviar la "cadena de URL" al método exec.

 // ... const urlWithoutTrailingSlashes = 'https://example.com/no/en/'.replace(/\/+$/, '') const result = pattern.exec(urlWithoutTrailingSlashes)?.pathname?.groups // ...

Todavía no encontré una manera de hacer las barras diagonales finales opcionales en la expresión regular dentro del patrón como las limitaciones de las búsquedas anticipadas y los extremos con . Si alguien encuentra una manera, edite esta respuesta o agregue un comentario.

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