【问题标题】:Regex Numbers with 0 or 1 - follow by numbers带有 0 或 1 的正则表达式数字 - 后跟数字
【发布时间】:2019-08-12 20:00:32
【问题描述】:

我正在尝试匹配此字符串,但我没有开始工作。字符串只能包含数字或带有 1 个破折号后跟另一组数字的数字。

我的正则表达式:

^([0-9]*|[0-9]*\-{1}[0-9]*)$

前:

这张通行证

123

这一关

123-123

这应该失败,但它正在通过

123-

【问题讨论】:

  • 正则表达式中的 * 表示零个或多个。 123- 在破折号后面有零个或多个数字。
  • -123 有效吗? 123--123 有效吗?

标签: c# regex string numbers match


【解决方案1】:

这应该是最简单和最有效的方法:

^\d+(?:-\d+)?$

^[0-9]+(?:-[0-9]+)?$*

  • \d 是大多数正则表达式风格中可用的字符集,代表[0-9]。这是一种更简洁的数字匹配方式,但如果您更喜欢[0-9],您可以直接使用它。

  • 请注意,您的原始模式和其他人作为答案提供的模式在连字符后包含量词 {1}。这应该避免,因为它总是多余的。没有量词的单个字符等价于同一个字符后跟{1}

*编辑:Wiktor 提出了一些我不知道的事情。在某些正则表达式风格中,\d 包括所有 unicode 数字,而不仅仅是数字 0 到 9。如果这是一个问题,您可以使用模式 ^[0-9]+(?:-[0-9]+)?$

【讨论】:

【解决方案2】:

你很亲密!

* 量词匹配 0 个或多个数字。

您要查找的是匹配 1 个或多个数字的 + 量词。

修改你的例子:

^([0-9]*|[0-9]+\-{1}[0-9]+)$

将不匹配任何内容、单个数字或数字-数字

【讨论】:

    【解决方案3】:

    您需要了解正则表达式的不同部分在做什么。 * 表示零或任何数字的某个符号,在你的例子中是一个数字。

    如果您希望破折号后至少有一个数字,请使用 + 而不是星号。

    ^([0-9]*|[0-9]*\-{1}[0-9]+)$
    

    【讨论】:

      【解决方案4】:

      ^[0-9]+(-[0-9]+)*$

      ^[0-9]+ 以一个或多个数字开头

      (-[0-9]+)* 0 次或 1 次破折号后跟长度为 1 或更多的数字

      【讨论】:

        【解决方案5】:

        为了好玩,这里有一些无正则表达式的答案。我发现它们更容易阅读。

        如果 -123123--123 不允许:

        s.Split('-').All(x => x != string.Empty && x.All(char.IsDigit));
        

        对于-之间的元素,我们检查该元素不为空且仅由数字组成。

        如果允许-123123--123

        !s.EndsWith("-") && s.All(c => c == '-' || char.IsDigit(c));
        

        检查字符串s 不以- 结尾,并且s 仅由- 和数字组成。

        Try it online!

        请注意,char.IsDigit 将允许 ๔๕๖๗๘๙໐໑-௫௬௭௮。如果您不想匹配此替换 char.IsDigit()IsDigit():

        public static bool IsDigit(char c) => c >= '0' && c <= '9';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          • 2016-04-07
          • 2018-06-20
          • 2016-12-12
          • 2015-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多