我想制作正则表达式以确保输入是有效整数。我也想避免,人们会通过不匹配的前导零输入/^[^0][0-9]+$/
。所以我的最终解决方案是:
^[0-9]+(?<!^[0])$
这很好用,但起初我也试过了:
00001
我认为负面的后视与错误的字符串不匹配,但事实上确实如此。我可以输入类似pod 'Charts', '3.0.4'
的内容,它与整个单词匹配。
我做错了什么?
答案 0 :(得分:2)
答案 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
是字符串开头允许的零数。
答案 3 :(得分:0)
您的问题在于,由于您匹配^[0-9]+etc
,因此整个数字将匹配,包括前导零。
然后,在整个数字匹配之后,负面的lookbehind检查匹配前是否有任何零 - 事实并非如此,因为它们是的一部分比赛。
在应用其余的正则表达式后,前瞻只会进入。如果他们的添加使找到的匹配无效,则会被丢弃,但是他们不在确定首先匹配的内容时扮演任何角色。
因此,只需使用您找到的其他正则表达式(/^[^0][0-9]+$/
),它显然可以正常工作。
如@mrzasa所述,您的正则表达式也会匹配前导字母,因此使用^[1-9][0-9]*$
可能更适合您的目的(除非您想要字母,特殊标志,基本上任何其他字母unicode字符 - 包括空格 - 不是0
,以匹配)
用+
替换*
也允许1位数字(来自@WiktorStribiżew的公然“被盗”的建议)。