首页 > 解决方案 > JavaScript - 带有十进制值的正则表达式

问题描述

我正在尝试创建一个验证红色/绿色/蓝色值表达式的正则表达式。我需要正则表达式匹配的表达式包括:

  1. RGB(1, 10, 100)
  2. RGB(100, 10, 1)
  3. RGB(1,2,3)
  4. RGBA(1, 2, 3, .75)
  5. rgba(1, 2, 3, 0.75)
  6. RGBA(1, 2, 3, 0)
  7. RGBA(1, 2, 3, 1)

目前,我有以下正则表达式:

^rgba?\((([+-]?\d+(\.\d+)?),\s*){2}[+-]?\d+(\.\d+)?(,\s*(0?\.\d|[01]))?\)$

此表达式适用于#1、#2、#3、#6 和#7。但是,#4 和#5 失败。我一直盯着最后一组。对我来说,它看起来应该接受小数。显然,它不是。我究竟做错了什么?

标签: javascriptregex

解决方案


正则表达式中的问题是,您的表达式不允许最后一个小数点后面的长度大于 1 的值。考虑到原来的正则表达式:

^rgba?\((([+-]?\d+(\.\d+)?),\s*){2}[+-]?\d+(\.\d+)?(,\s*(0?\.\d|[01]))?\)$

你会得到 rgba(1, 2, 35.132, 0.7) 的正值,但 rgba(1, 2, 35.132, 0.75) 的负值。

解决方案是在最后一个 \d 数字表示符上添加一个星号,表示可以有任意数量的数字。加号会更好,因为它会检测到小数点后有 0 位的错误值,需要至少 1 个 \d 实例。

^rgba?\((([+-]?\d+(\.\d+)?),\s*){2}[+-]?\d+(\.\d+)?(,\s*(0?\.\d*|[01]))?\)$

推荐阅读