匹配范围的正则表达式

克里斯

我有以下问题:

  • 字符串将通过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}[;])*$?

这个正则表达式不能解决我的问题,例如在input-expression中的字母通常返回true,但应该返回false。关于如何解决这个问题的任何想法?

这是RB评论之后的regex的简化版本:

  • 开始: ^(\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}))?;

到RegexStorm的永久链接包括两个无效的测试用例1234-12345678912345

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

[A-Za-z]

并通过以下方式进行验证:

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

尽管如果以后确实需要使用范围,则正则表达式对此很有用,但最好使用string.Splitand的组合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
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章