Java 正则表达式的含义是什么;任何正整数,不包括0“;
如何改进Java 正则表达式的含义是什么;任何正整数,不包括0“;,java,regex,Java,Regex,如何改进^\d+$以禁止0 编辑(使其更具体): 允许的示例: 1 30 111 不允许的示例: 0 00 -二十二 不管是否允许带前导零的正数(例如022) 这是用于Java JDK正则表达式实现的。尝试以下方法: ^[1-9]\d*$ …和一些填充超过30个字符,因此答案限制:-) 得到了这个: ^[1-9]|[0-9]{2,}$ 有人赢了吗?:) 您可能需要这个(编辑:允许表单编号0123): 然而,如果是我,我会做 int x = Integer.parseInt(s) if (x
^\d+$
以禁止0
编辑(使其更具体):
允许的示例:1
30
111
不允许的示例:
0
00
-二十二 不管是否允许带前导零的正数(例如
022
)
这是用于Java JDK正则表达式实现的。尝试以下方法:
^[1-9]\d*$
…和一些填充超过30个字符,因此答案限制:-)
得到了这个:
^[1-9]|[0-9]{2,}$
有人赢了吗?:) 您可能需要这个(编辑:允许表单编号0123
):
然而,如果是我,我会做
int x = Integer.parseInt(s)
if (x > 0) {...}
很抱歉来晚了,但OP希望允许
076
,但可能不希望允许0000000000
所以在这种情况下,我们需要一个由一个或多个数字组成的字符串,其中至少包含一个非零。就是
^[0-9]*[1-9][0-9]*$
为了好玩,另一种选择是使用lookaheads:
^(?=\d*[1-9])\d+$
任意数字,但必须至少有一个是
[1-9]
您可以尝试一种消极的前瞻性断言:
^(?!0+$)\d+$
^[1-9]*$是我能想到的最简单的
^\d*[1-9]\d*$
这可以包括所有正值,即使前面用零填充
允许
一,
01
十,
11等
不允许
0
00
000等。试试这一个,这一个最能满足要求
[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
这应该只允许小数大于0
^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
此正则表达式匹配0中的任意正整数:
(?<!-)(?<!\d)[1-9][0-9]*
(?
它适用于两个负数lookbehind,它在一个数字之前搜索负数,表示它是负数。它也适用于任何大于-9的负数(例如-22)。我的模式很复杂,但它完全覆盖了“任何正整数,不包括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]))$
任何正整数,不包括0:^\+?[1-9]\d*$
任何正整数,包括0:^(0 | \+?[1-9]\d*)$
您想接受吗,例如,076
?@Karl Knechtel:但为了简单起见,我可以牺牲此功能。“任何正整数,不包括0”请注意,0不是一个正整数。出于好奇,为什么我们在结尾需要\d+?为什么^[1-9]+$
不起作用?@mtahmed:^[1-9]+$
不允许10它将允许1。“\d*”也与空字符串匹配。@mtahmed^[1-9]+$
将不允许10
@Mulmoth该建议将允许1
,因为\d*
匹配零次或多次。但是,它将不允许076
,因为它不是以[1-9]
开头的。但是01
呢?两个问题:这也匹配“123abc”,并返回123,这可能会引发ParseException。@Daniel:我想这可能会在更大的解析方案中使用,因此您将有一个只捕获数字的regex/BNF,以及一个java代码来检查捕获的数字是否为非零正。@Daniel:在任何情况下,您仍然需要将数据作为整数,因此迟早会出现这种情况您仍然需要调用parseInt()或滚动您自己的parseInt()。@Daniel:Integer.parseInt()
本身增加的开销很小。抛出和捕获异常的代价很高。@Lie:\\+?
前缀是怎么回事?我猜这应该是一个转义加号,就像Java源代码中出现的那样,但为什么?如果不允许使用减号,我认为可以安全地假设加号不存在,同样。这将允许00
您想要这个吗?并且它将允许1aaaaa
和abcd01
^
只属于第一个备选方案,而$
只属于第二个备选方案,为了解决这个问题,在它周围放上括号([1-9]|[0-9]{2,})$
好的,它接受000000000
。您说的是除零以外的任何整数。此正则表达式将错误地与10
和29303
等数字不匹配。它还将匹配空字符串。这似乎满足了OP的要求。我想要正整数和正小数。您有什么解决方案吗?您需要你应该把它作为一个新问题而不是一个评论来问。但是扰流器:^[0-9]*[1-9][0-9]*(\.[0-9]+)$
但是这是对“十进制”的一个假设。你需要指数部分吗?这很复杂,所以问另一个问题。+1用于考虑角落情况!顺便说一句,这个模式的工作原理完全相同:^0*[1-9]\d*$
因为第一个[0-9]*
仅在[1-9]
找到第一个非零之前处于活动状态,也就是说,它仅在有初始零(0*
)之前处于活动状态。这是正确的答案。它接受00098,这是问题的正确行为。谢谢,但与接受的答案相比,它没有增加任何价值或优雅。[1-9]\d*
@Zeemee这是不正确的,因为\d可能包含非0-9的数字。例如一些库中的阿拉伯数字,如واحددددددددددددد。@dummyDev我不知道。谢谢您的提及!遗憾的是,“123abcd”会返回真的。Charith Jayasanka-是的,它仍然需要一个“$,02等等…
^((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]))$