为什么这个整数正则表达式不起作用?
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
是字符串开头允许的零个数。
您的问题是,由于您要匹配 ^[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+$/
我想制作一个正则表达式来确保输入是一个有效的整数。我也想避免人们通过不匹配的前导零来输入 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
是字符串开头允许的零个数。
您的问题是,由于您要匹配 ^[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+$/