none
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

    sábado, 23 de junio de 2018 23:03

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.

    domingo, 24 de junio de 2018 7:59
  • 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

    domingo, 24 de junio de 2018 13:53
  • 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.
    domingo, 24 de junio de 2018 16:32