问题
Currently I have this regex which matches to an RGB string. I need it enhanced so that it is robust enough to match either RGB or RGBA.
rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/; //matches RGB
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"]
回答1:
Will this do?
var rgbRegex = /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/
回答2:
It's not so simple- an rgb is illegal with a fourth parameter. You also need to allow for percentage decimals as well as integer values for the rgb numbers. And spaces are allowed almost anywhere.
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;
}
//testing:
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
回答3:
I made a regex that checks for rgb() and rgba() values. It checks for 3 tuples of 0-255 and then an optional decimal number between 0-1 for transparency. 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*?)?\)
Broken into the different parts we have:
rgba?\( // Match rgb( or rgba( as the a is optional
0-255 is matched with alternation of:
\d\d? // Match 0-99
1\d\d // Match 100 - 199
2[0-4]\d // Match 200-249
25[0-5] // Match 250 - 255
The handling of comma and space around the 0-255 tuples takes some space. I match 0-255 tuples with mandatory trailing comma and optional spaces twice
(25[0-5]|2[0-4]\d|1([0-9]){1,2}|\d\d?)\s*,\s*){2}
Then a 0-255 tuple with optional comma and space - to allow for rgb() values without the trailing comma
(25[0-5]|2[0-4]\d|1([0-9]){1,2}|\d\d?),?\s*
Then comes an optional 0-1 as whole number or decimal number:
([01]\.?\d*?)? // 0 or 1 needed, dot and decimal numbers optional
And we end with a closing bracket
\)
回答4:
If you need to be strict, i.e. rule out rgb(0, 70, 255, 0.5), you need to fuse both cases together with | :
var rgbRegex = /(^rgb\((\d+),\s*(\d+),\s*(\d+)\)$)|(^rgba\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+\.\d+)*\)$)/;
http://jsfiddle.net/YxU2m/2/
回答5:
i use this it is help
(.*?)(rgb|rgba)\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)/i
if you check rgba(102,51,68,0.6)
it will return
1. [0-0] ``
2. [0-4] `rgba`
3. [5-8] `102`
4. [9-11] `51`
5. [12-14] `68`
6. [15-18] `0.6`
and if you check rgb(102,51,68)
it will return
1. [21-21] ``
2. [21-24] `rgb`
3. [25-28] `102`
4. [29-31] `51`
5. [32-34] `68`
回答6:
This regex is a good compromise between the complexity of the regex and number of use-cases covered.
/(rgb\(((([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]),\s*){2}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\)))|(rgba\(((([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]),\s*){3}(1|1.0*|0?.\d)\)))/
rgb and rgba need to be treated differently as one needs the 4th argument and one doesn't.
This regex takes that into account. It also deals with:
- 1, 2 or 3 digit rgb values
- rgb values under 0 and over 255
- (some) spaces
- a 4th value missing from rgba
- a 4th value in rgb
This regex does not take into account:
- every legal type of spacing
- percentage based rgb values
回答7:
Try the following script for RGBA value, the result is an object.
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);
回答8:
For patterns: rbga(12,123,12,1) rbga(12,12,12, 0.232342) rgb(2,3,4)
/^(rgba|rgb)\(\s?\d{1,3}\,\s?\d{1,3}\,\s?\d{1,3}(\,\s?(\d|\d\.\d+))?\s?\)$/
来源:https://stackoverflow.com/questions/7543818/regex-javascript-to-match-both-rgb-and-rgba