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

136
Vistas
Dividir una ruta cuando el delimitador de ruta se usa en un nombre de componente

Esto se siente como una pregunta tonta, pero tengo una cadena como:

 aaaa/bbb\/ccc

El \/ representa un delimitador escapado que se usa en el nombre de un componente de ruta.

Entonces, la cadena representa dos componentes de ruta aaaa y bbb/ccc

Esta cadena se genera en función de la necesidad de crear una ruta desde los componentes de la ruta donde la necesidad es usar / como delimitador entre los componentes y / también puede aparecer en el nombre de un componente. Esta es la razón detrás de la necesidad de escapar / cuando aparece en el nombre de un componente.

Puede haber dos o más componentes.

Usar una expresión regular como (?:\\\/|[^\/])+ está cerca de lo que estoy buscando, pero al considerar la cadena this/is\/a/\/str\\/ing , falla para dividirlo en los componentes this & is\/a & \/str\\ & ing .

En su lugar, se determina que el componente final es \/str\\/ing .

Mi pregunta es, ¿cómo se ve el código javascript que me permitiría dividir rutas en componentes de ruta cuando el delimitador de componente se puede usar en el nombre de un componente?

En el ejemplo anterior, me gustaría terminar con dos cadenas aaaa y bbb/ccc ?

¿Existe una función estándar que se ocupe de esto o necesitaría usar una expresión regular para ayudarme a dividir?

Gracias.

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

0

Usando una coincidencia, puede usar:

 (?:[^\n\/\\]+|\\[\\\/]?)+

Explicación

  • (?: Sin grupo de captura
    • [^\n\/\\]+ Coincide con cualquier carácter excepto una nueva línea / o \
    • | O
    • \\[\\\/]? Partido \ y opcional \ o /
  • )+ Cerrar el grupo de no captura y repetir 1+ veces

Demostración de expresiones regulares

Luego, en los partidos, puede reemplazar \/ con /

 const regex = /(?:[^\n\/\\]+|\\[\\\/]?)+/g; [ String.raw `aaaa/bbb\/ccc`, String.raw `this/is\/a/\/str\\/ing`, String.raw `aaaa/bbb\\/ccc/ddd\/eee/fff/ggg`, String.raw `this/is\/a/dumb/str\\/ing`, String.raw `aaaa/\\bbb` ].forEach(s => console.log(Array.from(s.matchAll(regex), m => m[0].replace("\\/", "/"))) );

Si se admite una mirada hacia atrás, puede usar dividir con una alternancia para hacer coincidir 2 escenarios donde la cadena debe dividirse.

Luego puede reemplazar \/ con / para la matriz de resultados utilizando el mapa de matriz, por ejemplo.

 (?<=\\\\)\/|(?<!\\)\/

Explicación

  • (?<=\\\\)\/ Match / cuando va precedido directamente por \\
  • | O
  • (?<!\\)\/ Match / cuando no está precedido por \

Demostración de expresiones regulares

 [ String.raw `aaaa/bbb\/ccc`, String.raw `this/is\/a/\/str\\/ing`, String.raw `aaaa/bbb\\/ccc/ddd\/eee/fff/ggg`, String.raw `this/is\/a/dumb/str\\/ing`, String.raw `aaaa/\\bbb` ].forEach(s => console.log( s .split(/(?<=\\\\)\/|(?<!\\)\//) .map(m => m.replace("\\/", "/"))));

about 4 years ago · Juan Pablo Isaza Denunciar

0

Primero, debido a que esto involucra javascript y sus reglas de escape, la cadena aaaa/bbb\/ccc debe ser aaaa/bbb\\/ccc .

Esta es mi solución actual:

 //path = "aaaa/\\bbb"; //path = "this/is\\/a/dumb/str\\\\/ing"; path = "aaaa/bbb\\/ccc"; console.log("Path: ", path); const matches = path.match(/((?:[^\/\\]|\\\/|\\\\|\\)+)/g); console.log("M: ", matches); const pathComponents = matches.reduce((accumulator, component) => { component = component.replace("\\/", "/"); accumulator.push(component); return accumulator; }, []); console.log("Path Components: ", pathComponents); pathComponents.forEach((component) => { console.log(`C: ${component}`); });

Necesito ejecutar los partidos a través de un segundo pase para poder convertir el partido:

 bbb\\/ccc

En algo que se mostrará correctamente. Sin el segundo pase, se mostraría como

 bbb\/ccc

y necesita mostrarse como:

 bbb/ccc

Caso 1

 path = "aaaa/\\bbb";

Veo que se muestra:

 C: aaaa C: \bbb

Caso #2

 path = "this/is\\/a/dumb/str\\\\/ing";

Veo que se muestra:

 C: this C: is/a C: dumb C: str\\ C: ing

Caso #3 (similar al #2)

 path = "aaaa/bbb\\/ccc";

Veo que se muestra:

 C: aaaa C: bbb/ccc

ÉXITO en todos los casos.

Creo que he captado todos los casos extremos aquí.

Resulta que este es un problema más difícil de lo que pensé originalmente.

about 4 years ago · Juan Pablo Isaza Denunciar

0

 const a = String.raw `aaaa/bbb\/ccc/ddd\/eee/fff/ggg`; console.log(a.replace(/\\\//g, "|").split("/").map(x => x.replaceAll("|", "/")));

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