正则表达式 - 格式HH:MM,小时> = 24,负值

时间:2016-03-28 08:10:35

标签: c# asp.net regex

我想为这个特定的模式创建一个正则表达式:

  • 应该以' +'或' - '开头。或者没什么。
  • 数字或小时。它可以从' 0'开始。 (例如00 => 0,1 => 1,01 => 1,0000089 => 89)
  • 跟随':'
  • 然后,分钟数。 (最多59,它也可以仅以' 0'字符开头,09 => 9,9 => 9)

这是我到目前为止所得到的:

    private string regexPattern = @"^" + // Start of string (anchor)
                                 "(" + // begin capturing group
                                 "(+|-)?" + // "+" or "-" - is optional
                                 "(0*)?" + // a "0" - is optional
                                 "[0-9]*" + // accepts any number of digits
                                 ")" + // end capturing group
                                 ":" + "(" + // start capturing
                                 "[0 - 5]" + // character between 0 and 5
                                 "\\d" + // one digit
                                 ")" + // end group
                                 "$"; // end of string anchor

但我收到语法错误:

  

System.ArgumentException:解析" ^((+ | - )?(0)?[0-9] +):( [0 - 5] \ d)$"    - 量词{x,y}无效。

我不知道我的模式是否正确创建。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

错误的直接原因是您必须逃离+\+。建议的模式是

  // Note \+ instead of just +
  String pattern = @"^(\+|-)?[0-9]+:[0-5]?[0-9]$";

解释

   (\+|-)?     - either + or - or nothing
   [0-9]+      - any digits, but at least 1, note that 000089 matchs [0-9]+
   :           - semicolumn 
   [0-5]?[0-9] - 0..59 with 00..09 possibility

你没有提供使用群组的代码,所以我放弃了它们;但是,如果需要,您可以轻松恢复组,例如

  String pattern = @"^(?<hours>(\+|-)?[0-9]+):(?<minutes>[0-5]?[0-9])$";

答案 1 :(得分:0)

你的正则表达式中有一些东西需要改进,所以让我们从完整的模式开始:^((?:\+|-)?[0-9]+):([0-5]?\\d)$

我有:

  • 转发了+ - 签名并使(?:\+|-)?成为非捕获群组 - 但您也可以使用[+-]?,模式将为^([+-]?[0-9]+):([0-5]?\\d)$ - 只是想点失踪的逃脱
  • 删除了(0*)?
  • 已捕获的[0-9]+
  • [0-9]*更改为[0-9]+,因为冒号前应至少有一个数字
  • [0 - 5]中移除了空格并将其设为可选(单个数字似乎从您的问题中有效)=&gt; [0-5]?