我有一个文本框,可以输入打印。以下是可接受的模式
1,4-5,6,7-9或1,2,3,4-5或1,2-9,10-15,16。
我尝试使用以下代码,但有些情况失败
List<bool> result = new List<bool>();
string[] array = inputstring.Split(',');
int i = 0;
foreach (string k in array)
{
result.Add(Regex.IsMatch(k, @"^\d+|(\d+-\d+)$"));
i++;
}
foreach (bool b in result)
{
if (b.Equals(false))
{
MessageBox.Show("Please enter valid entry for print pages");
return;
}
}
提前致谢
答案 0 :(得分:1)
好像你想要这样的东西,
^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)+$
+
重复前一个标记一次或多次。
或强>
^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*$
*
重复前一个标记零次或多次。
答案 1 :(得分:1)
答案 2 :(得分:0)
这不是正则表达式解决的问题。
你会在其他答案中看到一些部分解决方案,但除了难以维护之外,他们不会处理基本的事情,比如验证页面范围是否合理。
使用自定义处理程序更简单,更灵活:
答案 3 :(得分:0)
如果您需要验证数字的顺序是否正在增加,并且范围的起始值小于结束值,那么您可以执行以下操作。
public static bool ValidPrintRanges(string ranges)
{
int previousEnd = 0;
foreach (var range in ranges.Split(','))
{
var pair = range.Split('-');
int begin, end = 0;
if (pair.Length > 2)
{
return false; // more than one dash
}
// No dash, try to parse and check to previous end
if (pair.Length == 1)
{
if (!int.TryParse(range, out end)
|| previousEnd >= end)
{
return false;
}
}
// One dash, parse both compare to each other and to previous end
else if (pair.Length == 2)
{
if (!int.TryParse(pair[0], out begin)
|| !int.TryParse(pair[1], out end)
|| previousEnd >= begin
|| begin >= end)
{
return false;
}
}
previousEnd = end;
}
return true;
}
答案 4 :(得分:0)
^(\d+(-\d+)?)(,\d+(-\d+)?)*$
注意:您无法使用regexp验证范围中的第一个值是否大于第二个值。