【问题标题】:Regex expression for matching ranges匹配范围的正则表达式
【发布时间】:2017-01-13 10:08:28
【问题描述】:

我有以下问题:

  • 将通过正则表达式验证字符串。
  • 字符串包含用分号分隔的范围或单个值,例如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};)*$?

【问题讨论】:

  • 负-10-10范围和降范围200-100怎么样?
  • 不允许负数范围,降序数是
  • 为什么不先用分号再用破折号分割字符串。最后使用 int.TryParse.
  • @jdweng 虽然我在这里同意这种方法,但似乎 OP 只是在进行验证,所以这可能有点矫枉过正,但是如果他们正在使用结果,那么我会这样做
  • 您可以使用\A(?<val>[0-9]{1,5}(?:-[0-9]{1,5})?)(?:;(?<val>[0-9]{1,5}(?:-[0-9]{1,5})?))*;\z。 val 组捕获将保存这些值。好吧,正则表达式模式可以动态构建以使其更具可读性。

标签: c# .net regex


【解决方案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.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
    }
}

【讨论】:

  • 正则表达式将允许输入如1234- 和1234512345。此外,它确实允许前导(或全部)零,尽管原来的也是如此,所以只需指出这一点
  • @pinkfloydx33 我已经更新了很好的捕获,所以它现在应该可以工作了
  • @pinkfloydx33 我现在也添加了一个永久链接以进行测试,并修复了另一个问题,因此它会在比赛开始时检查单词边界
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多