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

Why is this Regex for integers not working?

我想制作一个正则表达式来确保输入是一个有效的整数。我也想避免人们通过不匹配的前导零来输入 001234。所以我的最终解决方案是:

/^[^0][0-9]+$/

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

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

我认为负面回溯不会匹配错误的字符串,但实际上确实如此。我可以输入类似 00001 的内容,它匹配整个单词。

我做错了什么?

更新 根据@WiktorStribiżew 评论编辑的正则表达式。

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

如果要使用negative lookbehind,放在主组之前:^(?!0)[0-9]+$

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

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

Regex demo

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

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

前瞻仅在 其余正则表达式应用后发挥作用。如果他们的添加使找到的匹配项无效,则将其丢弃,但他们不会首先确定匹配的内容。

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


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

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

使用否定先行法确保第一个数字不是 0 (demo 1)

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

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