Javascript JS中带有命名组的RGB正则表达式

Javascript JS中带有命名组的RGB正则表达式,javascript,regex,Javascript,Regex,我正在尝试用JS为RGB颜色字符串编写一个带有可选不透明度值的regexp。为了获得每个通道和不透明度的数据,我捕获了命名组 一切正常,但对我来说有些奇怪。当“B”值在[200-255]范围内时,最后一位数字总是转到不透明度组 例如: rgb 195 230 199->r:195,g:230,b:199(一切正常) rgb 195 230 199 0.25->r:195,g:230,b:199,不透明度:0.25(一切正常) rgb 195 230 200->r:195,g:230,b:20,不

我正在尝试用JS为RGB颜色字符串编写一个带有可选不透明度值的regexp。为了获得每个通道和不透明度的数据,我捕获了命名组

一切正常,但对我来说有些奇怪。当“B”值在[200-255]范围内时,最后一位数字总是转到不透明度组

例如:

rgb 195 230 199
->r:195,g:230,b:199(一切正常)

rgb 195 230 199 0.25
->r:195,g:230,b:199,不透明度:0.25(一切正常)

rgb 195 230 200
->r:195,g:230,b:20,不透明度:0(不清晰)

在200-255范围内,这种奇怪的行为也是如此。然后花上一个小时来解决这个问题,我需要一些帮助

完整的regexp是:

^(?:rgb|rgba)?[\s+\/]*\(?[\s+\/]*(?<r>[01]?\d\d?|2[0-4]\d|25[0-5])[\s+\/]+(?<g>[01]?\d\d?|2[0-4]\d|25[0-5])[\s+\/]+(?<b>[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])(?:\s)?(?<opacity>0\.\d{1,2}|[1-9]\d{0,1}(?!\d)|100|0|1)??(?:\%)?\)?$
[编码><码><码><<码><码><码>以下以下以下以下以下几几???[码><码><码><以下以下以下几??????????????????????????????????????????????????????????[[[0[01[01[[01]?[0-1]d?????[0-d?2[0-0-4]2[0-0-0-0-4]0-0-0-0-4???????[0-0-0-0-4 3 3 3;0-0-4;0-0-4;0-4 5 5 5 5 5 5 5???????????????124;25[0-0-0-0-4;25!\d)| 100 | 0 | 1)?(?:\%)?\$ 分成几部分:

^
(?:rgb|rgba)?
[\s+\/]*
\(?
[\s+\/]*
(?<r>[01]?\d\d?|2[0-4]\d|25[0-5])
[\s+\/]+
(?<g>[01]?\d\d?|2[0-4]\d|25[0-5])
[\s+\/]+
(?<b>[01]?\d\d?|2[0-4]\d|25[0-5])
(?:\s)?
(?<opacity>0\.\d{1,2}|[1-9]\d{0,1}(?!\d)|100|0|1)??
(?:\%)?
\)?
$
^
(?:rgb | rgba)?
[\s+\/]*
\(?
[\s+\/]*
(?[01]?\d\d?| 2[0-4]\d | 25[0-5])
[\s+\/]+
(?[01]?\d\d?| 2[0-4]\d | 25[0-5])
[\s+\/]+
(?[01]?\d\d?| 2[0-4]\d | 25[0-5])
(?:\s)?
(?0\.\d{1,2}|[1-9]\d{0,1}(?!\d)| 100 | 0 | 1)??
(?:\%)?
\)?
$

在最后一部分中,您正在匹配可选的空白字符
(?:\s)?

如果空格字符不是可选的,则此值将与rgb 195 230 200不匹配

^(?:rgba?)?[\s\/]*\(?[\s\/]*(?<r>[01]?\d\d?|2[0-4]\d|25[0-5])[\s\/]+(?<g>[01]?\d\d?|2[0-4]\d|25[0-5])[\s+\/]+(?<b>[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])(?: (?<opacity>0\.\d{1,2}|[1-9]\d?(?!\d)|100|0|1)?%?)?\)?$
但是,由于它是可选的,因此它可以从该替代中匹配
组中的20,并从该替代中匹配
组中的0


可以在不透明度组之前放置单词边界,也可以将该组设置为可选

^(?:rgba?)?[\s\/]*\(?[\s\/]*(?<r>[01]?\d\d?|2[0-4]\d|25[0-5])[\s\/]+(?<g>[01]?\d\d?|2[0-4]\d|25[0-5])[\s+\/]+(?<b>[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])(?: (?<opacity>0\.\d{1,2}|[1-9]\d?(?!\d)|100|0|1)?%?)?\)?$
在上述两项代码中,有以下几名以下以下的代码::::<以下以下以下以下以下的代码::::::::[0[01[0[01[0[0-4]0-412445 5[0-5 5 5[0-0-4]5[0-0-5[0-0-5 5 5[0-0-0-5]上述上述上述上述上述上述上述两名(以下以下以下以下以下以下简称::::::::::)????????????????????????????????????????[[[[[0[0[0[0[1[0[0-4]d\d\d\d\d???????124;2[2[0-2[0-4]2[0-4]0-4]0-0-4存存存存存存存存存存存1)%?)?\)$

请注意,通过省略多余的组和转义,例如
(?:\%)?
,并使用与
{0,1}
相同的
,可以稍微缩短模式


在本部分中,
[\s+\/]*
模式允许匹配
+
字符,而不是重复
\s
一次或多次,因为它是一个字符类。如果这不是意图,你可以省略
>

你可以在不透明度组之前增加一个词边界,在不透明度组之前增加一个词边界,在不透明度组之前增加一个词边界,并将模式稍微缩短一点。如果这不是意图,如果这不是意图,你可以省略你可以省略
^(如果这不是意图),你可以省略你可以在不透明度组之前增加一个词边界,你可以在不增加一个字边界,并将模式缩短一点。将模式缩短一点
^^(以下以下以下以下以下以下以下以下以下以下以下以下以下::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[1-9](?!\d)| 100 | 0 | 1)%?\)?$
这4行正则表达式本可以花费一些时间
.match()
/
.split()
/
.join()
并节省一些CPU周期。或者你也可以将不透明度部分的前导空格设为可选@YevgenGorbunkov是的,你肯定是对的。我必须这样做,因为我从“公共”部分以编程方式构建了许多正则表达式,以使其可读。至少我是这样认为的:DI不知道我能用命名组做到这一点。感谢您的帮助,让我的regexp变得更好!你为我节省了很多时间,也给了我一些知识,谢谢!