字符串的正则表达式校验有关问题

字符串的正则表达式校验问题
现在有个“字符串”校验的项目要做。

输入一串字符串,均由字母组成,长度固定20位。

判断规则是,输入的这串字符串匹配以下任意一个条件,则返回结果为真,若所有条件都匹配不上,则返回为假

判断条件1:“第2、3个字符是AA”
判断条件2:“第2、3个字符是BB”
判断条件3:“第4个字符是A,且第8个字符为A”
判断条件4:“第4个字符是B,且第8个字符为B”
判断条件5:“第3个字符是A,且第13个字符为C”
判断条件6:“第3个字符是B,且第10个字符为R,且第18个字符为M”
判断条件7:“第1个字符是A,且第20个字符是A”
……
判断条件100:“第2个字符是M,且第11、12个字符是H”

(判断条件有几百个)

举例:输入一个字符串:AAAAYYYYUUUUJJDHDJEJ,可以匹配上条件1,因此返回真。

判断条件有几百个,这个程序该怎样写,必须用正则表达式吗?可以用其它方法吗

方案1:把判断条件放到数据库里面去,这个不知道怎样设计数据库啊
方案2:用switch,要写几百个switch,不知道对性能影响怎样
方案3:把所有判断条件放到一个配置文件里面去

哪位大哥帮忙给个指引,谢谢了
------解决方案--------------------
如果规则比较简单,可以用Regex。Regex可以外部保存和维护。

List<string> patterns = new List<string>()
{
    "^.AA",
    "^.BB",
    "^...A...A",
    "^...B...B",
    "^..A.{9}C",
    "^..B.{6}R.{7}M",
    "^A.{18}A",

    "^.M.{8}HH",
};
string input = "AAAAYYYYUUUUJJDHDJEJ";
bool matched = patterns.Any(pattern => Regex.IsMatch(input, pattern));

------解决方案--------------------
我不推荐用正则,可以先用一个txt文件把你的规则写进去,如:

2-A
------解决方案--------------------
3-A
2-B
------解决方案--------------------
3-B
4-A
------解决方案--------------------
8-A
4-B
------解决方案--------------------
8-B
3-A
------解决方案--------------------
13-C
3-B
------解决方案--------------------
10-R
------解决方案--------------------
18-M
1-A
------解决方案--------------------
20-A
2-M
------解决方案--------------------
11-H
------解决方案--------------------
12-H

每一行代表一个规则,2-A
------解决方案--------------------
3-A表示第二个字符是A,第三个字符也是A
然后在程序启动的时候读取这个文件,初始化规则,存入一个列表中,完后再校验你的字符串,代码如下:

        static void Main(string[] args)
        {
            Console.WriteLine(ValidateString("AAAAYYYYUUUUJJDHDJEJ"));
        }

        public class StringRule
        {
            private Dictionary<int, char> dic = new Dictionary<int, char>();

            public StringRule(string rule)
            {
                string[] temp = rule.Split(new char[] { '
------解决方案--------------------
' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string s in temp)
                {
                    string[] temp2 = s.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                    dic.Add(int.Parse(temp2[0]), temp2[1][0]);
                }
            }

            public bool Validate(string str)
            {
                bool result = true;
                foreach (var key in dic.Keys)
                {
                    result &= str[key - 1] == dic[key];
                }
                return result;
            }
        }

        static List<StringRule> listRules = new List<StringRule>();

        static void InitRules()
        {
            if (listRules == null