“任何正整数,不包括0”的正则表达式是什么


91

如何^\d+$改进以禁止0

编辑(更具体):

允许的示例:
1
30
111
不允许的示例:
0
00
-22

是否允许以零开头的正数并不重要(例如022)。

这用于Java JDK Regex实现。


2
例如,您是否要接受076
卡尔·克内希特尔

@Karl Knechtel:但是为了简单起见,我可以牺牲此功能。
Zeemee

3
“任何正整数,不包括0”注意0不是正整数。
SK9 2014年

Answers:


176

试试这个:

^[1-9]\d*$

...以及某些填充超过30个字符的答案限制:-)。

这是演示


出于好奇,为什么我们最后需要\ d +?为什么不行^[1-9]+$
mtahmed 2011年

18
@mtahmed:^[1-9]+$不允许10
Lie Ryan

1
它将允许1。“ \ d *”也匹配空字符串。
丹尼尔(Daniel)

@mtahmed ^[1-9]+$不允许10。该建议将允许@Mulmoth 1,因为它\d*匹配零次或多次。但是,它不允许076,因为它不能以开头[1-9]
卡尔·克内希特尔

2
但是呢01
Museful

71

很抱歉,迟到了,但OP希望允许,076但可能不想允许0000000000

因此,在这种情况下,我们需要一个包含至少一个非零的一个或多个数字字符串。那是

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

这似乎符合OP想要的东西
阿卜杜勒·

我想要正整数和正十进制。你有什么解决方案吗?

您应该将其作为新问题而不是评论来提问。但破坏者:^[0-9]*[1-9][0-9]*(\.[0-9]+)$但这是对“十进制”的含义的假设。您需要指数部分吗?这很复杂,所以请问另一个问题。
雷·托尔

1
+1考虑特殊情况!顺便说一句,此模式将完全相同:^0*[1-9]\d*$由于第一个[0-9]*模式仅在[1-9]找到第一个非零值之前才有效,即只有在出现初始零(0*)时才有效。
mg007

1
这是正确的答案。它接受00098,这是每个问题的正确行为。
Varun Sharma


12

试试这个,这个最能满足需求。

[1-9][0-9]*

这是示例输出

String 0 matches regex: false
String 1 matches regex: true
String 2 matches regex: true
String 3 matches regex: true
String 4 matches regex: true
String 5 matches regex: true
String 6 matches regex: true
String 7 matches regex: true
String 8 matches regex: true
String 9 matches regex: true
String 10 matches regex: true
String 11 matches regex: true
String 12 matches regex: true
String 13 matches regex: true
String 14 matches regex: true
String 15 matches regex: true
String 16 matches regex: true
String 999 matches regex: true
String 2654 matches regex: true
String 25633 matches regex: true
String 254444 matches regex: true
String 0.1 matches regex: false
String 0.2 matches regex: false
String 0.3 matches regex: false
String -1 matches regex: false
String -2 matches regex: false
String -5 matches regex: false
String -6 matches regex: false
String -6.8 matches regex: false
String -9 matches regex: false
String -54 matches regex: false
String -29 matches regex: false
String 1000 matches regex: true
String 100000 matches regex: true

2
谢谢,但与接受的答案相比并没有增加任何价值或雅致[1-9]\d*
Zeemee

1
与\ d不正确的@Zeemee可能包含非0-9的数字。例如,某些图书馆中的阿拉伯数字(例如واحد)。
dummyDev

@dummyDev我没有意识到。感谢您的提及!
Zeemee

遗憾的是,这对于“ 123abcd”将返回true。
Charith Jayasanka

查理斯·贾亚桑卡(Charith Jayasanka)-是的,它仍然需要在开始处加上一个^,并在结束处加上一个“ $” :-)
史蒂夫·巴罗蒂

7

^\d*[1-9]\d*$

这可以包括所有正值,即使前面用零填充

允许

1个

01

10

11等

不允许

0

00

000等


3

任何正整数,不包括0:^\+?[1-9]\d*$
任何正整数,包括0:^(0|\+?[1-9]\d*)$


2

得到这个:

^[1-9]|[0-9]{2,}$

有人打吗?:)


3
这样可以00吗?它将允许1aaaaaabcd01^只属于第一替代和$仅使第二,为解决周围此放括号^([1-9]|[0-9]{2,})$
STEMA

好吧,这可以接受000000000。您确实说过任何除零以外的整数。
雷·托尔

2

只是为了好玩,使用前行的另一种选择:

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

所需的位数尽可能多,但必须至少一位[1-9]


2

您可能想要这样(编辑:允许表单的编号0123):

^\\+?[1-9]$|^\\+?\d+$

但是,如果是我,我会做

int x = Integer.parseInt(s)
if (x > 0) {...}

1
两个问题:这也匹配“ 123abc”,并返回123,这可能会引发ParseException。
丹尼尔(Daniel)

@Daniel:我想这可能会在较大的解析方案中使用,因此您将拥有一个仅捕获数字的regex / BNF,以及一个Java代码来检查捕获的数字是否为非零正数。
Lie Ryan

@Daniel:在任何情况下,您仍然需要将数据作为整数,因此迟早仍需要调用parseInt()或滚动自己的parseInt()。
Lie Ryan

@Daniel:Integer.parseInt()本身增加了很少的开销。抛出和捕获异常非常昂贵。
艾伦·摩尔

@Lie:\\+?前缀如何处理?我猜想这应该是转义的加号,就像它在Java源代码中一样,但是为什么呢?如果不允许使用负号,我认为也可以假设正号也可以。
艾伦·摩尔

0

此RegEx匹配任何0以外的正整数:

(?<!-)(?<!\d)[1-9][0-9]*

它与两个负向后查找配合使用,后者在数字前搜索负号,表示该数字为负数。它也适用于任何大于-9的负数(例如-22)。


0

我的模式很复杂,但是它恰好覆盖了“任何正整数,不包括0”(1-2147483647,不长)。用于十进制数字,不允许前导零。

^((1?[1-9][0-9]{0,8})|20[0-9]{8}|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})
|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})
|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7]))$

-2

^ [1-9] * $是我能想到的最简单的


此正则表达式将错误地无法匹配诸如10和的数字29303。它还将匹配空字符串。
OmnipotentEntity

-3

这应该只允许小数> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
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.