51,411
社区成员
发帖
与我相关
我的任务
分享
const reg = /^(-?[1-9]\d+\.\d+)|(-?\d\.\d+)|(-?[1-9]\d*)|0$/
想写一个验证只能输入正负数和小数的正则表达式,但是写出来发现“1.”这种后面跟个小数点的也能通过验证不知道为什么
有大佬可以帮忙讲一下吗,刚开始看正则有点晕
你的正则表达式中有一个小问题,导致它可以匹配到像"1."这样的字符串。问题在于你的正则表达式中使用了[1-9]来匹配正整数部分,但是它没有考虑到整数部分只有一位数的情况,因为[1-9]表示的是匹配一位数的数字,而不是可能是零的情况。
要修正这个问题,你可以将整数部分的正则表达式改为(-?0|(-?[1-9]\d*)),这样就考虑到了整数部分可能是零的情况。整个正则表达式可以修改为:
const reg = /^(-?(0|0\.\d+)|(-?[1-9]\d*\.\d+)|(-?[1-9]\d*)|0\.\d+)$/;
这样修改后,正则表达式就能正确地匹配到正负数和小数,同时排除了类似"1."这样的情况。
正则表达式 ^(-?[1-9]\d+\.\d+)|(-?\d\.\d+)|(-?[1-9]\d*)|0$ 的各部分解释如下:
(-?[1-9]\d+\.\d+): 匹配带小数点的正负数,但不能以0开头(不包括无限小数或整数部分为0的数)。(-?\d\.\d+): 匹配带小数点的正负数,其中整数部分只有一位数字,并且该数字可以是0。(-?[1-9]\d*): 匹配不带小数点的正负整数,不能以0开头。0: 精确匹配数字0。在这个正则表达式中,字符串 "1." 被匹配到的原因是以下这部分:
(-?[1-9]\d*\.\d*) 或者 (-?\d\.\d+)它允许整数部分后面跟一个小数点和零个或多个小数位。由于正则表达式内的 \d* 表示“零个或多个数字”,所以使得 "1." 匹配成功,即便小数部分不存在(也就是没有数字跟随小数点)。
如果你的目的是匹配小数且要求小数点后至少有一位数字,你应该使用 \d+ 替换正则表达式中相关部分的 \d*。\d+ 表示“至少有一个数字”。这样更新后的正则表达式应该如下:
const reg = /^(-?[1-9]\d*\.\d+)|(-?\d\.\d+)|(-?[1-9]\d+)|0$/;
但请注意,现在 -?\d\.\d+ 这部分会匹配所有形式的单个数字加上小数点和至少一个小数位,例如 "-0.5" 或 "2.3"。如果你确实不希望匹配 "0" 开头的非零小数,需要进一步调整正则表达式。
非常非常感谢大佬的解答,我把大佬更新后的表达式放进去果然匹配不到“1.”了,但是我还有点不太理解的地方想请大佬帮忙解答一下
,我昨天自己又研究了一下,发现把我原来的表达式最外面套上一层()以后就匹配不到“1.”了,“^((-?[1-9]\d+\.\d+)|(-?\d\.\d+)|(-?[1-9]\d*)|0)$”我想弄明白这是为什么,我猜测是不是跟^$有关但是又不知道具体原因,希望大佬解答