language: C# (mono-2.8)
date: 243 days 11 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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* (?: (?<open> \( ) \s* )*
                        \d+
                        \s* (?: (?<-open> \) ) \s* )*
                        (?:
                                \s+(?:AND|OR)\s+
                                \s* (?: (?<open> \( ) \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); 
                }
        }
}