C# 匹配范围的正则表达式

C# 匹配范围的正则表达式,c#,.net,regex,C#,.net,Regex,我有以下问题: 字符串将通过正则表达式进行验证 字符串包含由分号分隔的范围或单个值,例如100-200;10;2300-3400;34; 每个数字的最大值为99999 字符串中不允许有字母 到目前为止,我所拥有的: ^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;

我有以下问题:

  • 字符串将通过正则表达式进行验证
  • 字符串包含由分号分隔的范围或单个值,例如
    100-200;10;2300-3400;34;
  • 每个数字的最大值为
    99999
  • 字符串中不允许有字母
到目前为止,我所拥有的:

^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?
因此,我的正则表达式由三种可选的组类型组成:

  • 开头:
    ^([0-9]{1,5}[-][0-9]{1,5}[;])^([0-9]{1,5}[;])?
  • 中间:
    ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])?
  • 结束:
    ([0-9]{1,5}[-][0-9]{1,5}[;])*$?([0-9]{1,5}[;])*$?
这个正则表达式不能解决我的问题,例如,输入表达式中的字母通常返回true,但应该返回false。有没有办法解决这个问题

这是regex的简化版本,引用了RB的评论:

  • 开头:
    ^(\d{1,5}\-\d{1,5};)^(\d{1,5};)?
  • 中间:
    (\d{1,5}\-\d{1,5};)?(\d{1,5};)?
  • 结束:
    (\d{1,5}\-\d{1,5};)*$?(\d{1,5};)*$?

这个如何提取组:

\b(?<FirstNum>[1-9][0-9]{1,4})(-(?<SecondNum>[1-9][0-9]{1,4}))?;
并通过以下方式进行验证:

Regex regex = new Regex("[A-Za-z]");
if (regex.IsMatch(inputString))
{
    //Invalid string
}

尽管正则表达式在以后实际需要使用范围时非常有用,但最好结合使用
string.Split
int.TryParse

string input = "100-200;10;2300-3400;34;";

string[] ranges = input.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string range in ranges)
{
    string[] numbers = range.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (string number in numbers)
    {
        int parsedNumber;
        if (!Int32.TryParse(number, out parsedNumber))
        {
            //Invalid input
            break; //Or return false...
        }

        //Use parsedNumber here
    }
}

负数
-10-10
范围和降序范围
200-100
如何?不允许使用负数范围,降序范围是为什么不使用字符串拆分,首先用分号拆分,然后用破折号拆分。最后使用int.TryParse.@jdweng虽然我同意这种方法,但OP似乎只是在进行验证,这样做可能有点过火,但是如果他们使用的是结果,我会这样做,您可以使用。
val
组捕获将保存这些值。好的,regex模式可以动态构建以使其更具可读性。regex将允许输入,例如
1234-
1234512345
。它也允许前导(或全部)零,尽管原来的一个也允许,所以只需指向它out@pinkfloydx33好的,我已经更新了,所以应该可以用了now@pinkfloydx33我已经添加了一个permalinkNow用于测试now,并修复了另一个问题,因此它会在匹配开始时检查单词边界
string input = "100-200;10;2300-3400;34;";

string[] ranges = input.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string range in ranges)
{
    string[] numbers = range.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (string number in numbers)
    {
        int parsedNumber;
        if (!Int32.TryParse(number, out parsedNumber))
        {
            //Invalid input
            break; //Or return false...
        }

        //Use parsedNumber here
    }
}