Saltar al contenido

Validar una expresión booleana con corchetes en C#

Investigamos en diferentes espacios y así darte la respuesta a tu dilema, si continúas con dudas deja tu inquietud y contestaremos con mucho gusto.

Solución:

Probablemente sea más sencillo hacer esto con un analizador simple. Pero puede hacer esto con expresiones regulares de .NET usando grupos de equilibrio y dándose cuenta de que si los corchetes se eliminan del string siempre tienes un string emparejado por una expresión simple como ^d+(?:s+(?:AND|OR)s+d+)*z.

Entonces, todo lo que tiene que hacer es usar grupos de equilibrio para asegurarse de que los corchetes estén equilibrados (y estén en el lugar correcto en la forma correcta).

Reescribiendo un poco la expresión anterior:

(?x)^
OPENING
d+
CLOSING
(?:
    s+(?:AND|OR)s+
    OPENING
    d+
    CLOSING
)*
BALANCED
z

((?x) hace que el motor de expresiones regulares ignore todos los espacios en blanco y los comentarios en el patrón, para que sea más legible).

Donde OPENING coincide con cualquier número (0 incluido) de paréntesis de apertura:

s* (?: (? ( ) s* )*

CLOSING coincide con cualquier número de paréntesis de cierre y también se asegura de que el grupo de equilibrio esté equilibrado:

s* (?: (?<-open> ) ) s* )*

y BALANCED realiza una verificación de equilibrio, fallando si hay más paréntesis abiertos que cerrados:

(?(open)(?!))

Dando la expresión:

(?x)^
s* (?: (? ( ) s* )*
d+
s* (?: (?<-open> ) ) s* )*
(?:
    s+(?:AND|OR)s+
    s* (?: (? ( ) s* )*
    d+
    s* (?: (?<-open> ) ) s* )*
)*
(?(open)(?!))
z

Si no desea permitir espacios aleatorios, elimine cada s*.

Ejemplo

Ver demostración en IdeOne. Producción:

matched: '2'
matched: '1 AND 2'
matched: '12 OR 234'
matched: '(1) AND (2)'
matched: '(((1)) AND (2))'
matched: '1 AND 2 AND 3'
matched: '1 AND (2 OR (3 AND 4))'
matched: '1 AND (2 OR 3) AND 4'
matched: ' ( 1    AND ( 2 OR  ( 3 AND    4 )  )'
matched: '((1 AND 7) OR 6) AND ((2 AND 5) OR (3 AND 4))'
matched: '(1)'
matched: '(((1)))'
failed:  '1 2'
failed:  '1(2)'
failed:  '(1)(2)'
failed:  'AND'
failed:  '1 AND'
failed:  '(1 AND 2'
failed:  '1 AND 2)'
failed:  '1 (AND) 2'
failed:  '(1 AND 2))'
failed:  '(1) AND 2)'
failed:  '(1)() AND (2)'
failed:  '((1 AND 7) OR 6) AND (2 AND 5) OR (3 AND 4))'
failed:  '((1 AND 7) OR 6) AND ((2 AND 5 OR (3 AND 4))'
failed:  ''

Sección de Reseñas y Valoraciones

Puedes patrocinar nuestro trabajo exponiendo un comentario o dejando una valoración te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *