为什么这个整数的正则表达式不起作用?

时间:2018-02-07 13:40:49

标签: regex negative-lookbehind

我想制作正则表达式以确保输入是有效整数。我也想避免,人们会通过不匹配的前导零输入/^[^0][0-9]+$/ 。所以我的最终解决方案是:

^[0-9]+(?<!^[0])$

这很好用,但起初我也试过了:

00001

我认为负面的后视与错误的字符串不匹配,但事实上确实如此。我可以输入类似pod 'Charts', '3.0.4' 的内容,它与整个单词匹配。

我做错了什么?

4 个答案:

答案 0 :(得分:2)

/(?!^0)^\d+$/

使用否定前瞻(demo 1)确保第一个数字不是0

另一个选择是使用:(demo 2

/^[1-9]\d+$/

答案 1 :(得分:1)

UPDATE 正则表达式根据@WiktorStribiżew编辑进行编辑。

第一个正则表达式将匹配a121312,因为[^0]匹配任何字符0

如果您想使用负面的lookbehind,请将它放在主要组:^(?!0)[0-9]+$

之前

要匹配有效整数,您可以使用^[1-9][0-9]*$,请参阅示例:https://regex101.com/r/qjsA0G/1

答案 2 :(得分:0)

如果你想在开始时避免使用零,请使用^(?!0)\d+$,否则使用^(?!0{n,})\d+$,其中n-1是字符串开头允许的零数。

Regex demo

答案 3 :(得分:0)

您的问题在于,由于您匹配^[0-9]+etc,因此整个数字将匹配,包括前导零。

然后,在整个数字匹配之后,负面的lookbehind检查匹配前是否有任何零 - 事实并非如此,因为它们是的一部分比赛

在应用其余的正则表达式后,前瞻只会进入。如果他们的添加使找到的匹配无效,则会被丢弃,但是他们在确定首先匹配的内容时扮演任何角色。

因此,只需使用您找到的其他正则表达式(/^[^0][0-9]+$/),它显然可以正常工作。

如@mrzasa所述,您的正则表达式也会匹配前导字母,因此使用^[1-9][0-9]*$可能更适合您的目的(除非您想要字母,特殊标志,基本上任何其他字母unicode字符 - 包括空格 - 不是0,以匹配) 用+替换*也允许1位数字(来自@WiktorStribiżew的公然“被盗”的建议)。