字符串的正则表达式校验有关问题
字符串的正则表达式校验问题
现在有个“字符串”校验的项目要做。
输入一串字符串,均由字母组成,长度固定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可以外部保存和维护。
------解决方案--------------------
我不推荐用正则,可以先用一个txt文件把你的规则写进去,如:
每一行代表一个规则,2-A
------解决方案--------------------
3-A表示第二个字符是A,第三个字符也是A
然后在程序启动的时候读取这个文件,初始化规则,存入一个列表中,完后再校验你的字符串,代码如下:
现在有个“字符串”校验的项目要做。
输入一串字符串,均由字母组成,长度固定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