正则表达式javascript匹配RGB和RGBA

for*_*ice 5 javascript regex rgb rgba

目前我有这个正则表达式匹配RGB字符串.我需要它增强,以便它足够强大,以匹配RGB或RGBA.

rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/; //matches RGB
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/YxU2m/

var rgbString =  "rgb(0, 70, 255)";
var RGBAString = "rgba(0, 70, 255, 0.5)";

var rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;
//need help on this regex
//I figure it needs to be ^rgba?, and then also an optional clause to handle the opacity

var partsRGB = rgbString.match(rgbRegex);
var partsRGBA = RGBAString.match(rgbRegex);

console.log(partsRGB); //["rgb(0, 70, 255)", "0", "70", "255"]
console.log(partsRGBA); //null. I want ["rgb(0, 70, 255, 0.5)", "0", "70", "255", "0.5"] 
Run Code Online (Sandbox Code Playgroud)

Rus*_*sak 9

这会吗?

var rgbRegex = /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/
Run Code Online (Sandbox Code Playgroud)


ken*_*bec 7

这不是那么简单 - 第四个参数rgb是非法的.您还需要允许百分比小数以及rgb数字的整数值.几乎可以在任何地方使用空间.

function getRgbish(c){
    var i= 0, itm,
    M= c.replace(/ +/g, '').match(/(rgba?)|(\d+(\.\d+)?%?)|(\.\d+)/g);
    if(M && M.length> 3){
        while(i<3){
            itm= M[++i];
            if(itm.indexOf('%')!= -1){
                itm= Math.round(parseFloat(itm)*2.55);
            }
            else itm= parseInt(itm);
            if(itm<0 || itm> 255) return NaN;
            M[i]= itm;
        }
        if(c.indexOf('rgba')=== 0){
            if(M[4]==undefined ||M[4]<0 || M[4]> 1) return NaN;
        }
        else if(M[4]) return NaN;
        return M[0]+'('+M.slice(1).join(',')+')';
    }
    return NaN;
}
Run Code Online (Sandbox Code Playgroud)

//测试:

var A= ['rgb(100,100,255)',
'rgb(100,100,255,.75)',
'rgba(100,100,255,.75)',
'rgb(100%,100%)',
'rgb(50%,100%,0)',
'rgba(100%,100%,0)',
'rgba(110%,110%,0,1)'];

A.map(getRgbish).join('\n');

returned values:
rgb(100,100,255)
NaN
rgba(100,100,255,.75)
NaN
rgb(127,255,0)
NaN
NaN
Run Code Online (Sandbox Code Playgroud)


Gib*_*boK 6

尝试使用以下脚本获取 RGBA 值,结果是一个对象。

       var getRGBA = function (string) {
          var match = string.match(/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/);
          return match ? {
            r: Number(match[1]),
            g: Number(match[2]),
            b: Number(match[3]),
            a: Number(match[4])
          } : {}
        };
                           
        var rgba = getRGBA('rgba(255, 255, 255, 0.49)');
        console.log(rgba);
Run Code Online (Sandbox Code Playgroud)


Pis*_*tus 5

我制作了一个检查rgb()和rgba()值的正则表达式.它检查3个0-255元组,然后检查0-1之间的可选十进制数,以获得透明度.TLDR;

rgba?\(((25[0-5]|2[0-4]\d|1\d{1,2}|\d\d?)\s*,\s*?){2}(25[0-5]|2[0-4]\d|1\d{1,2}|\d\d?)\s*,?\s*([01]\.?\d*?)?\)
Run Code Online (Sandbox Code Playgroud)

分成我们的不同部分:

rgba?\( // Match rgb( or rgba( as the a is optional
Run Code Online (Sandbox Code Playgroud)

0-255与以下的交替匹配:

\d\d? // Match 0-99

1\d\d // Match 100 - 199

2[0-4]\d // Match 200-249

25[0-5] // Match 250 - 255
Run Code Online (Sandbox Code Playgroud)

处理0-255元组周围的逗号和空格需要一些空间.我将0-255个元组与强制尾随逗号和可选空格匹配两次

(25[0-5]|2[0-4]\d|1([0-9]){1,2}|\d\d?)\s*,\s*){2}
Run Code Online (Sandbox Code Playgroud)

然后是一个带有可选逗号和空格的0-255元组 - 允许rgb()值而不带尾随逗号

(25[0-5]|2[0-4]\d|1([0-9]){1,2}|\d\d?),?\s*
Run Code Online (Sandbox Code Playgroud)

然后是一个可选的0-1作为整数或十进制数:

([01]\.?\d*?)? // 0 or 1 needed, dot and decimal numbers optional
Run Code Online (Sandbox Code Playgroud)

我们以结束括号结束

\)
Run Code Online (Sandbox Code Playgroud)