【问题标题】:Regex - format HH:MM , Hours >= 24 , negative value正则表达式 - 格式 HH:MM ,小时 >= 24 ,负值
【发布时间】:2016-03-28 08:10:35
【问题描述】:

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

  • 应该以 '+' 或 '-' 开头,或者什么都没有。
  • 数字或小时数。它可以以 '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} 什么都没有。

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

任何帮助将不胜感激。

【问题讨论】:

  • 您需要escape +\+ 或根据您的语言(+|-)
  • 您还需要删除[0 - 5] 之间的空格。应该是[0-5]
  • 正则表达式不是解析小时值的正确工具。正则表达式中的值具有上下文,在这种情况下有更好的工具。使用 c# 时,DateTime.TryParse 是更好的选择。识别 24 vs 34 vs 25 会让你的正则表达式变得非常复杂。

标签: c# asp.net regex


【解决方案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])$";

【讨论】:

    【解决方案2】:

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

    我有:

    • 转义 +-sign 并将 (?:\+|-)? 设为非捕获组 - 但您也可以使用 [+-]?,然后模式将是 ^([+-]?[0-9]+):([0-5]?\\d)$ - 只是想指出丢失的转义
    • 删除了(0*)?,因为它已被[0-9]+ 捕获
    • [0-9]* 更改为[0-9]+,因为冒号前至少应该有一个数字
    • [0 - 5] 中删除了空格并将其设为可选(从您的问题来看,一位数似乎是有效的)=> [0-5]?

    【讨论】:

    • 我稍微改变了你的模式:^(((?:\\+|-)?[0-9]+):([0-5]?\\d))? $ 如果是空字符串,我想匹配我的模式。我所有的单元测试都通过了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多