本次是要完成一个关于页码范围的验证。就是我们使用word文档进行打印的时候,页码的选择范围。在这个输入框中我们可以输入具体的页码(如:3)也可以使用范围(如:3-5)。而且可以使用“,"来连接多个选项(如1,3,4-5)。
要实现数据合法性验证大致分两步:
第一步 运用正则表达式验证格式的正确性 也就是判断数字,“,”以及“-”的使用是否合法,即(如1,3,4-5)我们认为合法,(1,3,2-5)或者(1,5-2,30)这些格式正确但是存在页码重复或者5-2这种顺序错误的表达方式我们在第一步也判定为格式正确(这些错误表达我们会在第二部验证)具体正则表达式如下:
string strRegex = @"^[1-9](\d)?(-\d+)?([,,]\d+(-\d+)?)*$";
bool flag = Regex.IsMatch(str.Trim(), strRegex);
第二步 通过逻辑运算验证页码是否存在重复或者页码顺序错误
private bool Method(string str, int MaxValue, Control control)
{
string strRegex = @"^[1-9](\d)?(-\d+)?([,,]\d+(-\d+)?)*$";
var flag = Regex.IsMatch(str.Trim(), strRegex);
richTextBox1.Clear();
if (flag)
{
var list = new List<(int, int)>();
foreach (var item in str.Split(new char[] { ',', ',' }))
{
if (item.Contains('-'))
{
var result = item.Split('-');
if (Convert.ToInt32(result[0]) > Convert.ToInt32(result[1]))
{
errorProvider1.SetError(control, "数据顺序错误");
return false;
}
else
{
list.Add((Convert.ToInt32(result[0]),
Convert.ToInt32(result[1])));
}
}
else
{
list.Add((Convert.ToInt32(item), Convert.ToInt32(item)));
}
}
var resultMerge = list.Select(x => Enumerable.Range(x.Item1, x.Item2 - x.Item1 + 1)).SelectMany(x => x).ToList();
var distinctResult = resultMerge.Distinct().ToList();
distinctResult.Sort();
if (distinctResult.Count() < resultMerge.Count())
{
errorProvider1.SetError(control, "数据存在交集");
return false;
}
if (distinctResult.Last() > MaxValue)
{
errorProvider1.SetError(control, "数据设定范围");
return false;
}
errorProvider1.Clear();
distinctResult.ForEach(x => richTextBox1.AppendText(x + " "));
return true;
}
else
{
errorProvider1.SetError(control, "数据基本格式错误");
return false;
}