匹配范围的正则表达式

时间:2017-01-13 10:08:29

标签: c# .net regex

我有以下问题:

  • 要通过regex-expression验证字符串。
  • 该字符串包含由分号分隔的范围或单个值,例如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。关于如何解决这个问题的任何想法?

这是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};)*$?

1 个答案:

答案 0 :(得分:1)

如何提取组:

\b(?<FirstNum>[1-9][0-9]{1,4})(-(?<SecondNum>[1-9][0-9]{1,4}))?;

Permalink to RegexStorm包括两个无效的测试用例1234-12345678912345

然后检查它是否包含任何字母只需使用以下表达式:

[A-Za-z]

并通过以下方式验证:

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

虽然如果您以后真的需要使用范围,正则表达式对此有用,但最好使用string.Splitint.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
    }
}