using System; using System.Text.RegularExpressions; public class Test { public static void Main(){ string[] tests = { // matching "2", "1 AND 2", "12 OR 234", "(1) AND (2)", "(((1)) AND (2))", "1 AND 2 AND 3", "1 AND (2 OR (3 AND 4))", "1 AND (2 OR 3) AND 4", " ( 1 AND ( 2 OR ( 3 AND 4 ) )", "((1 AND 7) OR 6) AND ((2 AND 5) OR (3 AND 4))", "(1)", "(((1)))", // should fail "1 2", "1(2)", "(1)(2)", "AND", "1 AND", "(1 AND 2", "1 AND 2)", "1 (AND) 2", "(1 AND 2))", "(1) AND 2)", "(1)() AND (2)", "((1 AND 7) OR 6) AND (2 AND 5) OR (3 AND 4))", "((1 AND 7) OR 6) AND ((2 AND 5 OR (3 AND 4))", "" }; string re = @"(?x)^ \s* (?: (? \( ) \s* )* \d+ \s* (?: (?<-open> \) ) \s* )* (?: \s+(?:AND|OR)\s+ \s* (?: (? \( ) \s* )* \d+ \s* (?: (?<-open> \) ) \s* )* )* (?(open)(?!)) \z"; foreach (string str in tests){ Match match = Regex.Match(str, re); if (match.Success) Console.WriteLine("matched: '{0}'", str); else Console.WriteLine("failed: '{0}'", str); } } }