是要在规定的规则里输入数据自动生成正则验证。
主要思路:遍历,判断 找范围正则验证规律例如(1-800)(001-800)(001-006)写递归
难点 :范围验证需要找不同的规律 例如
0到999范围的正则表达式分为三部分,
-
0至9
-
10至99
-
100至999
以及范围验证生成正则表达式是,位数要一样,后面要比前面大,双范围等等
先上效果图
首先给的规则是
@代表大写字母,*代表数字,%代表通配任意数字或大写字母仅限首尾,$代表任意数字或大写字母 (提示%号不能相邻,不能有两个百分号,只能在首尾,只能是大小写,提示范围必须后面大于前面,个位数必须补足位数输入)
直接上代码
初始是这样写的,但是后面发现很不严谨,范围有很大的问题
下面经过完善是要先先获取区间
思路(获取第一个文本框的() 根据位数判断大小)
(自己建的页面,控件命名还未改)截图截不下了,直接复制代码吧
string ToQuJian(string min, string max)
{
StringBuilder res = new StringBuilder("");
int sub = int.Parse(max) - int.Parse(min);
int temp1 = int.Parse(min);
int temp2 = int.Parse(max);
min = min.PadLeft(max.Length, '0');
int sumZero = max.Length - min.TrimStart('0').Length;
char[] minArray = min.ToArray();
char[] maxArray = max.ToArray();
if (temp1 < 10)
{
if (temp2 == 0)
return max;
else if (temp2 < 10)
return $"{"".PadLeft(max.Length - 1, '0')}[{temp1}-{temp2}]";
else
{
res.Append($"{"".PadLeft(max.Length - (SubTen(temp2) - 1).ToString().Length, '0')}{ToQuJian(temp1.ToString(), (SubTen(temp2) - 1).ToString())}|");
res.Append($"{ToQuJian(SubTen(temp2).ToString(), max)}");
}
return res.ToString();
}
else if (sumZero > 0)
{
res.Append("".PadLeft(sumZero, '0') + "(" + minZeroalgorithm(temp1, 10 * SubTen(temp1) - 1) + ")|");
if (10 * SubTen(temp1) < temp2 / SubTen(temp2) * SubTen(temp2) - 1)
res.Append($"{ToQuJian((10 * SubTen(temp1)).ToString(), (temp2 / SubTen(temp2) * SubTen(temp2) - 1).ToString())}|");
res.Append(minZeroalgorithm(temp2 / SubTen(temp2) * SubTen(temp2), temp2));
}
else
res.Append(minZeroalgorithm(temp1, temp2));
return res.ToString();
}
int SubTen(int sub)
{
int res = 1;
if (sub / 10 > 0)
res = 10 * SubTen(sub / 10);
else
res = 1;
return res;
}
string minZeroalgorithm(int min, int max)
{
StringBuilder res = new StringBuilder("");
if (min == max)
res.Append($"{min}");
else if (min < 10)
{
res.Append($"[{min}-{max}]");
}
else if (min % SubTen(min) == 0 && (max + 1) % (SubTen(max) * 10) == 0)
{
res.Append($"[{min / SubTen(min)}-{max / SubTen(max)}][0-9]{{{max.ToString().Length - 1}}}");
}
else
{
int StartNum = int.Parse(min.ToString().Substring(0, 1));
int StartNumMax = int.Parse(max.ToString().Substring(0, 1));
int Sub = SubTen(min);
int length = 0;
for (int i = Sub; i >= 1; i /= 10)
{
if (min / i == max / i)
length++;
else
break;
}
if (length > 0)
{
res.Append($"{min.ToString().Substring(0, length)}({ToQuJian(min.ToString().Substring(1, min.ToString().Length - 1), max.ToString().Substring(1, max.ToString().Length - 1))})");
}
else
{
res.Append($"{StartNum}({ToQuJian((min % Math.Pow(10, min.ToString().Length - length - 1)).ToString(), (1 * Sub - 1).ToString())})|");
if (Sub > 10 || max % 10 != 9)
{
if (StartNum + 1 != StartNumMax)
{
res.Append($"[{StartNum + 1}-{StartNumMax - 1}][0-9]{{{min.ToString().Length - 1}}}|");
}
res.Append($"{StartNumMax}({ToQuJian("0", max.ToString().Substring(1, max.ToString().Length - 1))})");
}
else
{
res.Append($"[{StartNum + 1}-{StartNumMax}][0-9]");
}
}
}
return res.ToString();
}
这边调用上面两个主方法,获取区间,进行输入限制判断
最后单例调用