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.