¿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….

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.