Salir de una expresión

Digamos que tengo estos dos ejemplos

  1. (A = 1) y (B = 2)
  2. (A = 1) (B = 2 ()).

Necesito una forma de get la siguiente matriz:

  1. [(],[A][=][1],[)],[and],[(],[B],[=],[2],[)]
  2. [(],[A][=][1],[)],[(],[B],[=],[2],[(],,[)][)]

Lo que traté de hacer es lo siguiente

Encuentre los delimitadores usando la siguiente function (en este caso, los delimitadores son el espacio " "y cualquier paréntesis ( o ) )

  function findExpressionDelimeter (textAreaValue){ var delimiterPositions = []; var bracesDepth = 0; var squareBracketsDepth = 0; var bracketsDepth = 0; for (var i = 0; i < textAreaValue.length; i++) { switch (textAreaValue[i]) { case '(': bracketsDepth++; delimiterPositions.push(i); break; case ')': bracketsDepth--; delimiterPositions.push(i); break; case '[': squareBracketsDepth++; break; case ']': squareBracketsDepth--; break; default: if (squareBracketsDepth == 0 && textAreaValue[i] == ' ') { delimiterPositions.push(i); } } } return delimiterPositions; } 

Luego traté de recorrer los valores devueltos y extraer los valores usando subcadena. El problema es que cuando tengo un ( o ) necesito get la siguiente subcadena así como también el corchete. Aquí es donde estoy atascado.

  function getTextByDelimeter(delimiterPositions, value) { var output = []; var index = 0; var length = 0; var string = ""; for (var j = 0; j < delimiterPositions.length; j++) { if (j == 0) { index = 0; } else { index = delimiterPositions[j - 1] + 1; } length = delimiterPositions[j]; string = value.substring(index, length); output.push(string); } string = value.substring(length, value.length); output.push(string); return output; } 

Cualquier ayuda sería apreciada.

Puede hacer coincidir los tokens que le interesan:

 var str = "(A = 1) and ( B = 2)"; var arr = str.match(/[()]|[^()\s]+/g); 

Resultado:

 ["(", "A", "=", "1", ")", "and", "(", "B", "=", "2", ")"] 

La expresión regular con algunos comentarios:

 [()] # match a single character token | # or [^()\s]+ # match everything else except spaces 

Si desea agregar más tokens de un solo carácter, como por ejemplo a = , simplemente agréguelo a ambas classs de caracteres. Es decir: [()=]|[^()=\s]+

Lo que quieres hacer es un analizador léxico .

Las expresiones regulares no le permitirán analizar un idioma (una expresión matemática es una). La descomposition del tree de la fórmula no se puede hacer con ella.

Sin embargo, regex puede permitirle discriminar tokens. Esto generalmente se hace leyendo la secuencia de caracteres. Una vez que has detectado un lexema, generas el token.

Si desea verificar la validez de la fórmula o calcular el valor, necesita un analizador sintáctico (analizador semántico). Esto no se puede hacer usando regex.

La pregunta similar con la respuesta está aquí .

Puede dividir su string(string.split('')) Y luego eliminar whitespaces en whitespaces de una array o simplemente verificar si la array[i] != ' ' Antes de su bloque de conmutadores.