/ / expresión regular para dividir cadenas evitando tokens dobles - javascript, arrays, regex, string, split

expresión regular para dividir cadena evitando tokens dobles - javascript, arrays, regex, string, split

Para dividir un valor de cadena en una matriz usando javascript, necesito dividirlo usando delimitadores. Los delimitadores repetidos indican un subvalor dentro de la matriz, por ejemplo

abc +! +; def +! +! +; 123 +! +; xyz

debería dividirse en abc, [def, 123], xyz

Mi expresión más cercana es ((?: +! (?! +!)) +; | $) Pero pensando en eso puede ser con la que comencé, ya que he pasado por tantas variaciones desde entonces.

Probablemente hay una respuesta cegadoramente obvia, pero después de lo que parece una eternidad, ahora estoy perplejo. Eché un vistazo a regex para analizar una cadena con caracteres escapados, y artículos similares que estaban cerca aunque no era el mismo problema, pero básicamente se detuvieron con ideas.

En algún lugar, alguien conocerá las expresiones regulares mucho mejor que yo, y espero que tengan una respuesta

Respuestas

1 para la respuesta № 1

Tengo esto para trabajar usando .split() con este patrón básico:

b+!+;b

Y entonces:

b+!+!+;b

Y así sucesivamente y así sucesivamente. Tendrás que convertir esto en una función recursiva, pero hice un básico JSFiddle para que comiences Primero dividimos la cadena usando nuestra primera expresión. Luego creamos nuestra nueva expresión agregando !+ (Esto se puede hacer fácilmente de forma dinámica). Ahora podemos recorrer nuestra matriz inicial, ver si la cadena coincide con nuestra nueva expresión y si vuelve a dividirla.

var string = "abc+!+;def+!+!+;123+!+;xyz",
data = string.split(/b+!+;b/);

var regex = /b+!+!+;b/
for(var i = 0; i < data.length; i++) {
var string = data[i];

if(string.match(regex)) {
data[i] = string.split(regex);
}
}

console.log(data);
// ["abc", ["def", "123"], "xyz"]

Estoy dejando la tarea de hacer de esto una función recursiva hasta OP. Si desea alguna dirección, puedo tratar de proporcionar más información.