Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

135
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!