Usuario
Expresiones regulares ´para evaluar una expresion matematica

Pregunta
-
Hola, tengo que evaluar expresiones matematicas que vienen en una cadena de caracteres de la siguiente forma
"[{(15-5)*5}/2]+(8-2)*{25+2}"
para validar que la expresion este bien escrita, estoy usando la funcion IaMatch de Regex de la siguiente forma
private bool AnalizadorSintactico(string Expresion) { string InvalidPattern = @"(\++)|(\+-)|(\+/)|(\+*)|(\--)|(\-+)|(\-/)|(\-*)|(\//)|(\/+)|(\/-)|(\/*)|(\**)|(\*+)|(\*-)|(\*/)"; if (Regex.IsMatch(Expresion, InvalidPattern)) { return false; } return true; }
Pero esto no esta funcionando correctamente, ya que siempre me devuelve false con expresiones que estan correctamente escritas, como por ejemplo
"[{(15-5)*5}/2]+(8-2)*{25+2}"
o tambien
"(56*32)"
alguien me podría ayudar por favor a ver donde estoy cometiendo el error?
Muchas gracias por su ayuda.
Gloria
Todas las respuestas
-
Así a simple vista, la expresión regular tiene el aspecto de ser completamente absurda, no se comprende cómo pretendías que "eso" validase una expresión aritmética. Tal vez si la desglosas y explicas la lógica que estabas siguiendo y cómo pretendías que funcionase podríamos proponer alguna alternativa.
Por ejemplo, tienes cosas como "...|(\**)|..." que significa "cero o más asteriscos seguidos", o "...|(\--)|..." que significa "dos guiones seguidos" (el escape inicial no hace nada porque el guión no es un carácter reservado), y de estas hay muchas. Y luego haces un "or" de todo ello, con lo que dices "acepto que exista cualquiera de estas combinaciones", y luego no lo anclas al final o al principio con lo que significa "puede estar en cualquier sitio de la cadena que valido".
En cualquier caso, validar una expresión aritmética mediante una expresión regular va a resultar casi imposible. Yo te recomendaría que no la valides por separado, sino que la uses para alimentar al propio parser que pensabas usar para evaluarla, y ese mismo parser ya te realizará la validación.
-
Estimado Alberto, agradezco el tiempo que te haz tomado para dar una respuesta a mi pregunta.
Ya he resuelto el problema gracias a la amabilidad de otra persona en stack overflow, quien me explico de la mejor manera el uso de las expresiones regulares, e incuso mas aun, me dio referencias a paginas donde puedo probar expresiones regulares.
si bien es cierto el código que puse en el post esta bastante "absurdo" no creo que eso te de derecho a responder de la manera en que lo haces.
Puede ser que tu y tus medallas de mvp, mcc, etc sean muy populares en este lugar, pero al parecer te faltan medallas en el tema de saber responder sin menospreciar a quienes no sabemos tanto como tu.
que tengas un excelente dia
-
Pido disculpas si la palabra "absurda" fue tal vez un poco fuerte y no debí usarla. Pero fíjate que justo a continuación expliqué el por qué me parecía absurda y me ofrecía a discutirlo, estudiar las razones y proponer alternativas. Creo que en lugar de responder con insultos, podrías haber respondido cuál era la lógica que habías seguido al construir la expresión, tal como yo te pedía, y podríamos haberla analizado, encontrar las razones por las que dicha lógica no lograba el resultado deseado y sugerir alternativas para conseguir el objetivo deseado.