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.
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+ vecesDemostració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("\\/", "/"))));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\\/cccEn algo que se mostrará correctamente. Sin el segundo pase, se mostraría como
bbb\/cccy necesita mostrarse como:
bbb/cccCaso 1
path = "aaaa/\\bbb";Veo que se muestra:
C: aaaa C: \bbbCaso #2
path = "this/is\\/a/dumb/str\\\\/ing";Veo que se muestra:
C: this C: is/a C: dumb C: str\\ C: ingCaso #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.
const a = String.raw `aaaa/bbb\/ccc/ddd\/eee/fff/ggg`; console.log(a.replace(/\\\//g, "|").split("/").map(x => x.replaceAll("|", "/")));