¿Es posible verificar la cadena de expresión matemática?

Quiero verificar que todos los corchetes comiencen y cierren apropiadamente y también que marque la expresión matemática o no en la cadena dada.

ex:

$str1 = "(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))"

$str2 = "(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))"

$str3 = "(A1+A2*A3)+A5++(B2+C1)))"

$str4 = "(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))"

En el ejemplo anterior $str1 y $str4 son cadenas válidas ….

Por favor ayuda….

Solutions Collecting From Web of "¿Es posible verificar la cadena de expresión matemática?"

Necesitarás un tipo de analizador. No creo que pueda manejar esto con una expresión regular, porque debe verificar la cantidad y el orden de los paréntesis y posibles nesteds. Esta clase a continuación es un puerto PHP rápido de un validador de syntax de expresiones Math basado en Python de paréntesis que encontré:

 class MathExpression { private static $parentheses_open = array('(', '{', '['); private static $parentheses_close = array(')', '}', ']'); protected static function getParenthesesType( $c ) { if(in_array($c,MathExpression::$parentheses_open)) { return array_search($c, MathExpression::$parentheses_open); } elseif(in_array($c,MathExpression::$parentheses_close)) { return array_search($c, MathExpression::$parentheses_close); } else { return false; } } public static function validate( $expression ) { $size = strlen( $expression ); $tmp = array(); for ($i=0; $i< $size; $i++) { if(in_array($expression[$i],MathExpression::$parentheses_open)) { $tmp[] = $expression[$i]; } elseif(in_array($expression[$i],MathExpression::$parentheses_close)) { if (count($tmp) == 0 ) { return false; } if(MathExpression::getParenthesesType(array_pop($tmp)) != MathExpression::getParenthesesType($expression[$i])) { return false; } } } if (count($tmp) == 0 ) { return true; } else { return false; } } } //Mathematical expressions to validate $tests = array( '(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))', '(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))', '(A1+A2*A3)+A5++(B2+C1)))', '(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))' ); // running the tests... foreach($tests as $test) { $isValid = MathExpression::validate( $test ); echo 'test of: '. $test .'
'; var_dump($isValid); }

Use la expresión regular que le devuelve la cantidad de corchetes iniciales y corchetes de cierre que hay allí?

luego verifica el número de ambas llaves … si es igual, entonces tu expresión es correcta, de lo contrario, sería incorrecta …

Bueno, supongo que lo que estás buscando es una gramática sin contexto o un autómata Pushdown . No se puede hacer solo con expresiones regulares. (al menos no hay una manera fácil o agradable)

Eso es porque estás tratando con estructuras anidadas. Aquí se puede encontrar alguna idea de una implementación Expresión regular para detectar C ++ terminado en dos puntos para ciclos de while.