2010-05-25 61 views
5

He usado regExp un poco pero aún lejos de ser un experto. Esta vez quiero validar una fórmula (o expresión matemática) por regExp. La parte difícil aquí es validar los paréntesis adecuados de inicio y finalización en la fórmula.
Creo que habría alguna muestra en la web pero no pude encontrarla. ¿Alguien puede publicar un enlace para ese ejemplo? o ayudarme por otros medios?RegExp para validar una fórmula (expresión matemática con paréntesis apareados)?

Respuesta

5

Los idiomas con paréntesis anidados coincidentes no son idiomas regulares y, por lo tanto, no pueden ser reconocidos por expresiones regulares. Algunas implementaciones de expresiones regulares (por ejemplo, en .NET Framework) tienen extensiones para manejar esto, pero realmente no es divertido trabajar con ellas. Así que sugiero usar un analizador disponible o implementar un analizador simple usted mismo (por el bien de la diversión).

Para la extensión en la implementación de .NET, vea el MSDN on balancing groups.

+0

Debía usar este RegExp como un patrón en el esquema XML para validar el valor de un atributo. ¿Alguna sugerencia en este contexto? – WSK

+0

* pero eso realmente no es divertido para trabajar * ¡es una subestimación! ¡Intentar diseccionar esos monstruos es una pesadilla! :) –

+0

Si desea utilizar las herramientas disponibles en el campo XML, puede intentar usar XSLT. XSLT es un lenguaje completo de Turing y, por lo tanto, es capaz de hacer el trabajo, pero realmente no puedo decir cuánto esfuerzo tomaría y si el resultado sería una buena pieza de código. –

3

Si su expresión matemática implica paréntesis anidados coincidentes, entonces no es una gramática normal sino una libre de contexto y, como tal, no se puede analizar utilizando expresiones regulares.

+0

+1 mientras sacaba las palabras de mi boca. Aunque uno podría acercarse con retroceso, pero eso es limitado y es, francamente, un truco y una señal de que está utilizando la herramienta incorrecta para el trabajo. –

+0

Mejor redactado: * no se puede analizar utilizando implementaciones de expresión regular que no admitan la coincidencia recursiva * (Perl, PHP y .NET * pueden * hacer esto). –

+0

@Bart - no especificó el idioma, así que supongo que es una expresión regular estándar, no – DVK

Cuestiones relacionadas