正则表达式(-?[1-9]\d+\.\d+)|(-?\d\.\d+)|([1-9]\d*)|0为什么能匹配到“1.”

草与岁月相伴 2023-12-27 16:40:55
const reg = /^(-?[1-9]\d+\.\d+)|(-?\d\.\d+)|(-?[1-9]\d*)|0$/

想写一个验证只能输入正负数和小数的正则表达式,但是写出来发现“1.”这种后面跟个小数点的也能通过验证不知道为什么

有大佬可以帮忙讲一下吗,刚开始看正则有点晕

...全文
1086 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
T0BSky 2024-05-22
  • 打赏
  • 举报
回复

你的正则表达式中有一个小问题,导致它可以匹配到像"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. (-?[1-9]\d+\.\d+): 匹配带小数点的正负数,但不能以0开头(不包括无限小数或整数部分为0的数)。
  2. (-?\d\.\d+): 匹配带小数点的正负数,其中整数部分只有一位数字,并且该数字可以是0。
  3. (-?[1-9]\d*): 匹配不带小数点的正负整数,不能以0开头。
  4. 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" 开头的非零小数,需要进一步调整正则表达式。

草与岁月相伴 2023-12-28
  • 举报
回复
@百锦再@新空间 非常非常感谢大佬的解答,我把大佬更新后的表达式放进去果然匹配不到“1.”了,但是我还有点不太理解的地方想请大佬帮忙解答一下,我昨天自己又研究了一下,发现把我原来的表达式最外面套上一层()以后就匹配不到“1.”了,“^((-?[1-9]\d+\.\d+)|(-?\d\.\d+)|(-?[1-9]\d*)|0)$”我想弄明白这是为什么,我猜测是不是跟^$有关但是又不知道具体原因,希望大佬解答
  • 举报
回复 1
@草与岁月相伴 楼上说的有些地方有点问题,我发表一下我的观点,作为讨论: 1.原正则表达式匹配的部分应该是(-?[1-9]\d*)这一部分,不是楼上说的那两部分,如何证明,可以删掉我这一部分或者楼上说的两部分分别验证,我已验证过。 2.为什么匹配的是(-?[1-9]\d*)这一部分,因为"^A|B|C$"和"^(A|B|C)$"不同,前者是说以A开头或者B结尾或者包含C的字符串,因为1.中包含了1,符合(-?[1-9]\d*)这个表达式。后者是字符串与A或者B或者C完全匹配,1.有个点就不能完全和(-?[1-9]\d*)匹配,所以为False,所以也就能解释为什么外面加个括号就是False了。 3.我原本发了又删掉是因为楼上的改进成功使匹配的为False让我有点心虚,但仔细看了修改后就能解释,楼上的修改有一处(-?[1-9]\d+)使得1后面必须跟有数字,所以不满足包含B字符的字符串。 4.希望对你有所帮助,欢迎讨论指正
  • 举报
回复
@宽于律己,严以待人 说错了,前者是说以A开头或者C结尾或者包含B的字符串

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧