任何大于0的数字的正则表达式?[关闭]


72

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

例如:

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

5
为什么它必须是正则表达式?那是用于这项工作的糟糕工具
Gareth 2012年

6
Gareth,在某些情况下,谷歌分析允许您仅使用正则表达式或完全匹配;-)
Skuta 2014年

Answers:


159

我不知道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栏,因此出现了括号。以后再说。

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

这将匹配大于1的任何整数任何浮点数。因此我们2.0将被匹配,但0.25不会匹配。在0*一开始把手前置零,因此005 == 5

                              |

在这种情况下,竖线字符是“”。为了评估此表达式,它的优先级高于所有其他表达式,并将两个正则表达式有效地连接在一起。括号用于对多个用or-分隔的表达式进行分组。

第二部分:

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

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

                                                    )$

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

当然,如果让您的编程语言以数字方式评估某些内容,而不是尝试将其与正则表达式进行匹配,则可以避免麻烦CPU。


1
你好 问题:其验证123asd,123.12kasdf
Vineet'DEVIN'Dev

1
@ Vineet'DEVIN'Dev,问题已解决。(谢谢,顺便说一句。)RE现在包含了括号,因为大多数解析器似乎将or-bar的权重比空锚高。
ghoti

嗨,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
Paresh3489227

我的答案中的正则表达式(您复制到评论中)不支持逗号作为千位分隔符。你可以在正则表达式匹配的模式,如果你想,但我认为,这些逗号是不实际的部分号码,但部分呈现。另外,在编写用于处理数字的代码时,您需要考虑本地化。有些地方使用逗号作为基数字符,使用句点作为数千个分隔符,或者根本不使用。这是一个正则表达式无法解决的更大问题。
ghoti

嗨,这都没有验证以下情况:00,任何负数,任何带有明确表示为正数的数字(例如+1),任何在句点后没有明确数字的表达式(例如1),或者没有这样的情况为-.5,在C中通常都将其视为有效数字。略微更改正则表达式字符串有助于解决以下情况:^ \ + * \- (0 * [0-9] [0-9] *(\ [0-9] +)?| 0 * + \。[0-9])$
NotANumber

16

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


您没有考虑负数。
m0skit0 2013年

11
@ m0skit0,而您没有考虑这个问题:"Looking to validate that an ID on my model is greater than 0 on submit."
cwharris

1
是的,他正在尝试使用此正则表达式验证输入是否大于0。这不能验证这一点。它只是验证它不为0
m0skit0

1
啊,我明白你在说什么。我相信当时我假设用户会知道将正则表达式包装在开始/结束符号中。这个更好。谢谢:)
cwharris 2013年

1
正则表达式没有锚点很好。ASP.NET RegularExpressionValidator始终将正则表达式视为两端锚定。
艾伦·摩尔



3

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

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

2
您如何确定这是否符合OP的要求?以及为什么效率较低[1-9]+[0-9]*而不是公认的答案呢?
基金莫妮卡的诉讼


1

你去那里:

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

提交时:

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

答案已修复...
SolidSnake 2012年

您没有考虑负数。
m0skit0 2013年

@ m0skit0再次阅读op的问题。其
大于

3
您的正则表达式必须确保它大于0,但不能大于0。负数不大于0。也许通过一个例子您会更好地理解:如果用户输入会发生什么-156?您的正则表达式表示肯定没问题时可以。
m0skit0 2013年


0

您可以使用以下表达式:

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

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

无效的输入:所有负实数以及0和0.0


0

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


其他答案的附加值是什么?
Toto

我只是搜索它以查找我的紧急工作,那时候我的头几乎没空了,所以我得到了这篇文章,但是这里的每个答案都很复杂,可能对于上级人员来说是需要的。但是我需要一个简单的解决方案,而不是复杂的解决方案。因此,我只是为喜欢我的人添加了它。
Rousonur Jaman

这恰好是接受答案的第一行。
Toto

第一个答案是巨大的,就像一篇带有某些段落的文章。但我需要一个简单的方法。
Rousonur Jaman

1
@ MRJaman,StackOverflow的重点是帮助人们学习,而不仅仅是提供免费的编程服务。通过提供这样的答案(人们会复制粘贴)而不是接受的答案及其解释,您实际上可能会阻碍学习。
格雷厄姆


-2

我认为这将完美地工作:

([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 ”。尽管我自由地承认自己不是数学家,但我很确定除第一个结果外,所有“无效”结果都将大于零。
ghoti

好吧,告诉我什么时候是您最后一次在任何其他数字前使用0时,您却不算01 02 03 04 ...也不是1,100,因为后零是不必要的..我强迫我的大脑进行了2个小时的锻炼该正则表达式的人谁可能需要它,因为我和有效性指的是正则表达式ONLY ..感谢您的反馈,即使它是一个巨魔的..
Zota DRAGOS PETRISOR

1
大声笑!!!“说,1.10大于0” - “什么!我把我的大脑挤了2个小时!你巨魔!”
Xen2050 '16


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.