【问题标题】:Regular Expression for any number greater than 0? [closed]任何大于0的数字的正则表达式? [关闭]
【发布时间】:2026-02-20 04:25:04
【问题描述】:

我正在寻找一种使用正则表达式检查数字是否大于 0 的方法。

例如:

  • 12 将返回 true
  • 0 将返回 false。

【问题讨论】:

  • 为什么必须是正则表达式?对于这项工作来说,这是一个糟糕的工具
  • Gareth,在某些情况下,谷歌分析只允许您使用正则表达式或完全匹配 ;-)

标签: regex


【解决方案1】:

我不知道 MVC 是如何相关的,但是如果你的 ID 是整数,这个 BRE 应该这样做:

    ^[1-9][0-9]*$

如果您想匹配实数(浮点数)而不是整数,则需要处理上述情况以及普通十进制数(即2.53.3̅),即模式介于 0 和 1 之间的情况(即0.25),以及您的模式的小数部分为0的情况。(即2.0)。在此过程中,我们将添加对整数前导零的支持(即005):

    ^(0*[1-9][0-9]*(\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$

请注意,第二个是扩展 RE。同样的事情可以在 Basic RE 中表达,但现在几乎所有东西都可以理解 ERE。让我们把表达式分解成更容易理解的部分。

    ^(

插入符号与行首的 null 匹配,因此在正则表达式之前使用插入符号将其锚定到行首。左括号在那里是因为下面的 or-bar。稍后会详细介绍。

      0*[1-9][0-9]*(\.[0-9]+)?

这匹配任何整数任何大于 1 的浮点数。所以我们的 2.0 会匹配,但 0.25 不会匹配。开头的0* 处理前导零,所以005 == 5

                              |

在此上下文中,管道字符是“or-bar”。出于评估此表达式的目的,它具有比其他所有内容更高的优先级,并且有效地将两个正则表达式连接在一起。圆括号用于对由 or-bars 分隔的多个表达式进行分组。

还有第二部分:

                               0+\.[0-9]*[1-9][0-9]*

这匹配以一个或多个0 字符开头的任何数字(将+ 替换为* 以匹配零个或多个零,即.25),后跟一个句点,后跟一串数字其中至少包括一个不是0。所以这匹配0 以上和1 以下的所有内容。

                                                    )$

最后,我们关闭括号并将正则表达式锚定到带有美元符号的行尾,就像插入符号锚定到行首一样。

当然,如果您让您的编程语言对某事物进行数值计算,而不是尝试将其与正则表达式进行匹配,那么您将节省 CPU 的麻烦。

【讨论】:

  • 嗨。问题:其验证 123asd、123.12kasdf
  • @Vineet'DEVIN'Dev,问题已解决。 (谢谢,顺便说一句。)RE 现在包括括号,因为大多数解析器似乎将 or-bar 的权重高于空锚。
  • 嗨 ghoti,我可以在以下模式中允许逗号吗 ^(0*[1-9][0-9]*(\.[0-9]+)?|0+\. [0-9]*[1-9][0-9]*)$。例如:1000.00 是 1,000.00 和 12324.56 是 12,324.56
  • 我的答案中的正则表达式(您复制到您的评论中)不支持逗号作为千位分隔符。如果您愿意,您可以在正则表达式中匹配该模式,但我建议这些逗号实际上不是 number 的一部分,而是 presentation 的一部分。此外,在编写处理数字的代码时,您需要考虑本地化;有些地方使用逗号作为基数字符,使用句点作为千位分隔符,或者根本不使用。这是一个比一个正则表达式所能解决的更大的问题。
  • 嗨,它既不验证这些情况:00、任何负数、任何明确表示为正的数字(例如,+1)、任何在句点后没有明确数字的表达式(例如,1 .),以及诸如 -.5 之类的情况,所有这些通常在 C 中都被视为有效数字。稍微更改正则表达式字符串有助于解决这些情况:^\+*\-(0*[0- 9][0-9]*(\.[0-9]+)?|0*+\.[0-9])$
【解决方案2】:

这个呢:^[1-9][0-9]*$

【讨论】:

  • 你没有考虑负数。
  • @m0skit0 你没有考虑这个问题:"Looking to validate that an ID on my model is greater than 0 on submit."
  • 是的,他希望通过这个正则表达式验证输入是否大于 0。这并不能验证这一点。它只验证它不是 0。
  • 啊,我明白你在说什么。我相信当时我假设用户会知道将正则表达式包装在开始/结束符号中。这个更好。谢谢:)
  • 没有锚点的正则表达式很好。 ASP.NET RegularExpressionValidator 始终将正则表达式视为锚定在两端。
【解决方案3】:

整数的另一种解决方案:

^[1-9]\d*$

\d 等同于[0-9]

【讨论】:

  • 此答案不符合问题要求。是 0.1 > 0 还是不是?但它肯定会为 value>0 工作。
【解决方案4】:
【解决方案5】:

我认为最好的解决方案是在正则表达式的两个括号之间添加+号:

^[1-9]+[0-9]*$

【讨论】:

  • 你有多确定这会做任何接近 OP 想要的事情?为什么使用效率较低的[1-9]+[0-9]* 而不是公认答案中的内容?
【解决方案6】:

如果您只想要非负整数,请尝试: ^\d+$

【讨论】:

    【解决方案7】:

    我试过这个,它适用于所有大于零的十进制/整数

    允许空格:^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

    没有空格:^(?=.*[1-9])\d*(?:\.\d{1,2})?$

    参考:Regex greater than zero with 2 decimal places

    【讨论】:

    • 一次我只复制粘贴。什么都不懂。
    【解决方案8】:

    简单的答案是:^[1-9][0-9]*$

    【讨论】:

    • 其他答案的附加价值是什么?
    • 我只是简单的搜索一下我的紧急工作,当时我的脑袋几乎是空的,然后我得到了这个帖子,但是这里的每个答案都很复杂,可能上层的人需要它。但我需要一个简单的解决方案,而不是复杂的解决方案。所以,我只是为像我这样的人添加它可能会得到帮助。
    • 这正是接受答案的第一行。
    • 第一个答案是巨大的,就像一篇有段落的文章。但我需要一个简单的。
    • @MRJaman,* 的目的是帮助人们学习,而不仅仅是提供免费的编程服务。通过提供这样一个人们会复制和粘贴的答案,而不是带有解释的公认答案,您实际上可能不鼓励学习。
    【解决方案9】:

    你去吧:

    MatchCollection myMatches = Regex.Matches(yourstring, @"[1-9][0-9]*");
    

    提交时:

    if(myMatches.Count > 0)
    {
       //do whatever you want
    }
    

    【讨论】:

    • 答案已修复...
    • 你没有考虑负数。
    • @m0skit0 再次阅读 op 的问题。它的大于 0
    • 您的正则表达式必须确保它大于 0 而它不会。负数不大于 0。也许你会通过一个例子更好地理解:如果用户输入 -156 会发生什么?你的正则表达式说没关系,但肯定不行。
    【解决方案10】:

    您可以使用以下表达式:

    (^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\.?\d*$)                  
    

    有效条目:1 1. 1.1 1.0 所有正实数

    无效条目:所有负实数以及 0 和 0.0

    【讨论】:

      【解决方案11】:

      仅简化 2 位小数。

      ^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$
      

      参考:https://www.regextester.com/94470

      【讨论】:

        【解决方案12】:

        我认为这会很有效:

        ([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])
        

        有效:

         1
         1.2
         1.02
         0.1 
         0.02
        

        无效:

        0
        01
        01.2
        1.10
        

        【讨论】:

        • Zota,问题中的标准是验证一个数字“大于 0”。虽然我坦率地承认我不是数学家,但我很确定你所有的“无效”结果除了第一个结果都会大于零。
        • 好吧,告诉我你最后一次在任何其他数字前面使用 0 是什么时候,你不算 01 02 03 04... 1,100 也不算,因为后面的零是非常不必要的.. 我强迫我的大脑花了 2 个小时来为可能像我一样需要它的人构建该正则表达式,并且有效性仅指该正则表达式。谢谢您的反馈,即使它是一个巨魔..
        • 哈哈!!! “说,1.10 大于 0” --- “什么!我压了我的大脑 2 小时!你这个巨魔!”
        【解决方案13】:
        [1-9]\.\d{1,2}|0\.((0?[1-9])|([1-9]0?)){1,2}\b
        

        【讨论】:

        • 解释一下就好了。
        【解决方案14】:

        对此使用非常简单的答案:\d*

        【讨论】:

        • 这也将匹配 0、00、000、0000 等。
        最近更新 更多