C#正则表达式为1,4-5,6,7-9或1,2,3,4-5或1,2-9,10-15,16

时间:2014-12-09 12:45:00

标签: c# regex

我有一个文本框,可以输入打印。以下是可接受的模式

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;
    }
} 

提前致谢

5 个答案:

答案 0 :(得分:1)

好像你想要这样的东西,

^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)+$

+重复前一个标记一次或多次。

^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*$

*重复前一个标记零次或多次。

DEMO

答案 1 :(得分:1)

^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*$

试试这个。看看演示。

https://regex101.com/r/iY3eK8/11

答案 2 :(得分:0)

这不是正则表达式解决的问题。

你会在其他答案中看到一些部分解决方案,但除了难以维护之外,他们不会处理基本的事情,比如验证页面范围是否合理。

使用自定义处理程序更简单,更灵活:

  • 拆分范围
  • 删除空格
  • 将它们解析为单个数字或范围对
  • (可选)验证范围是否有效(a&lt; b)和非重叠

答案 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+)?)*$

Regex

注意:您无法使用regexp验证范围中的第一个值是否大于第二个值。