1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
样例:
输入:'rgb(255, 255, 255) '
输入:'rgb(255, 255, 255) '
输出:'#ffffff'
'rgb(255, 255, 255)'
#ffffff
function rgb2hex(sRGB) {
if (/^rgb/.test(sRGB) === false) return sRGB
let nums = sRGB.split("(")[1].split(")")[0].split(",")
let hex = "#"
for (let index in nums) {
let num = parseInt(nums[index].trim())
console.log(num)
hex += num >= 0 && num < 16 ? ("0" + num.toString(16).toLowerCase()):num.toString(16).toLowerCase()
}
return hex
}
核心:toString(16)转16进制
// 这次的正则加了值的判断,也就是控制值 >= 0 并 <= 255
function rgb2hex(sRGB) {
const str = '\\s{0,}([0-9]{1,2}|[0-2]{1}[0-5]{1}[0-5]{1})\\s{0,}'
const reg = new RegExp(`^rgb\\(${str},${str},${str}\\)$`)
if (!reg.test(sRGB)) return sRGB
return '#' + sRGB
.replace(/[^\d|^,]/g, '')
.split(',')
.map(item => {
const hex = Number(item.trim()).toString(16)
return hex.length === 1 ? '0' + hex : hex
})
.join('')
}
function rgb2hex(sRGB) {
const req = /^rgb\(((?:\s*(?:(?:[1]\d\d){1}|(?:[2][0-5][0-5]){1}|\d{2}|\d{1}),?){3})\)$/g;;
var rgb = req.test(sRGB);
if (rgb) {
var color = sRGB.replace(req, function (match, $1) {
let arr = $1.split(',');
let r = Number(arr[0].trim()) > 16 ? Number(arr[0].trim()).toString(16) : "0" + Number(arr[0].trim()).toString(16);
let g = Number(arr[1].trim()) > 16 ? Number(arr[1].trim()).toString(16) : "0" + Number(arr[1].trim()).toString(16);
let b = Number(arr[2].trim()) > 16 ? Number(arr[2].trim()).toString(16) : "0" + Number(arr[2].trim()).toString(16);
return "#" + r.toString(16) + g.toString(16) + b.toString(16);
});
return color;
};
return sRGB;
}; function sixteen(x) {
x === 10 ? x = "a" : x === 11 ? x = "b" : x === 12 ? x = "c" : x === 13 ? x = "d" : x ===
14 ? x ="e" : x ===15 ? x = "f" : x
return x
}
function rgbHex(sRgb) {
var rgb1 = sRgb.split("(")[1]
var rgb2 = rgb1.split(")")[0]
var rgb3 = rgb2.split(",")
var firstQ = parseInt(rgb3[0] / 16);
var firstR = rgb3[0] % 16;
var secondQ = parseInt(rgb3[1] / 16);
var secondR = rgb3[1] % 16;
var thirdQ = parseInt(rgb3[2] / 16);
var thirdR = rgb3[2] % 16;
firstQ = sixteen(firstQ);
secondQ = sixteen(secondQ);
thirdQ = sixteen(thirdQ);
firstR = sixteen(firstR);
secondR = sixteen(secondR);
thirdR = sixteen(thirdR);
var hex = "#" + firstQ + firstR + secondQ +
secondR + thirdQ + thirdR
};
目前只想到这个最笨的,唉,正则就是记不住呢 function rgb2hex(sRGB) {
//reg是rgb判断并且分组的正则表达式,result_final是最后的输出结果
let reg = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, result_final = ['#'];
// let reg = /^rgb\((\d{1,3},\s*){2}\d{1,3}\)$/;
//如果不符合格式,直接把元字符串输出
if (!reg.test(sRGB)) {
return sRGB;
}
//如果符合样式,则进行进一步的处理
else {
let result = reg.exec(sRGB);
//result[1] result[2] result[3]分别代表每一个分组
for (let i = 1; i <= 3; i++) {
//result_item代表每一个分组之后10进制的结果,res代表16进制的结果
let result_item = [], res = [];
//利用加号转换为数字
result[i] = +result[i];
//如果是0直接变为['0','0'],否则为[]
res = result[i] === 0 ? ['0', '0'] : [];
while (result[i]) {
result_item.push(result[i] % 16);
result[i] = result[i] / 16 | 0;
}
//遍历每一个分组,将其转换为16进制的数字
result_item.forEach(item => {
switch (item) {
case 10: item = 'a'; break;
case 11: item = 'b'; break;
case 12: item = 'c'; break;
case 13: item = 'd'; break;
case 14: item = 'e'; break;
case 15: item = 'f'; break;
default: item += ''; break;
}
res.push(item)
})
//因为res保存的从上到下的余数,16进制输出时需要从下到上,所以需要反转
//将res最后的结果反转保存在result_final中
result_final = result_final.concat(res.reverse());
}
}
//将最后结果变为字符串,并且同时去掉逗号,返回出去
return result_final.toString().replace(/,/g, '');
} function rgb2hex(sRGB) {
let str = '#'
let arr = sRGB.substr(4, sRGB.length - 4 -1).split(',')
for (let i=0; i<arr.length; i++) {
arr[i] = parseInt(arr[i].trim())
if (arr[i] < 0 || arr[i] > 255 || isNaN(arr[i]) == true) {
return sRGB
}
arr[i] = arr[i].toString(16)
if (arr[i].length < 2) {
arr[i] = '0' + arr[i]
}
str += arr[i]
}
return str
}
没有用正则
function rgb2hex(sRGB) {
let rgbObj = {
0: "00",
1: "01",
2: "02",
3: "03",
4: "04",
5: "05",
6: "06",
7: "07",
8: "08",
9: "09",
10: "0a",
11: "0b",
12: "0c",
13: "0d",
14: "0e",
15: "0f",
16: "10",
17: "11",
18: "12",
19: "13",
20: "14",
21: "15",
22: "16",
23: "17",
24: "18",
25: "19",
26: "1a",
27: "1b",
28: "1c",
29: "1d",
30: "1e",
31: "1f",
32: "20",
33: "21",
34: "22",
35: "23",
36: "24",
37: "25",
38: "26",
39: "27",
40: "28",
41: "29",
42: "2a",
43: "2b",
44: "2c",
45: "2d",
46: "2e",
47: "2f",
48: "30",
49: "31",
50: "32",
51: "33",
52: "34",
53: "35",
54: "36",
55: "37",
56: "38",
57: "39",
58: "3a",
59: "3b",
60: "3c",
61: "3d",
62: "3e",
63: "3f",
64: "40",
65: "41",
66: "42",
67: "43",
68: "44",
69: "45",
70: "46",
71: "47",
72: "48",
73: "49",
74: "4a",
75: "4b",
76: "4c",
77: "4d",
78: "4e",
79: "4f",
80: "50",
81: "51",
82: "52",
83: "53",
84: "54",
85: "55",
86: "56",
87: "57",
88: "58",
89: "59",
90: "5a",
91: "5b",
92: "5c",
93: "5d",
94: "5e",
95: "5f",
96: "60",
97: "61",
98: "62",
99: "63",
100: "64",
101: "65",
102: "66",
103: "67",
104: "68",
105: "69",
106: "6a",
107: "6b",
108: "6c",
109: "6d",
110: "6e",
111: "6f",
112: "70",
113: "71",
114: "72",
115: "73",
116: "74",
117: "75",
118: "76",
119: "77",
120: "78",
121: "79",
122: "7a",
123: "7b",
124: "7c",
125: "7d",
126: "7e",
127: "7f",
128: "80",
129: "81",
130: "82",
131: "83",
132: "84",
133: "85",
134: "86",
135: "87",
136: "88",
137: "89",
138: "8a",
139: "8b",
140: "8c",
141: "8d",
142: "8e",
143: "8f",
144: "90",
145: "91",
146: "92",
147: "93",
148: "94",
149: "95",
150: "96",
151: "97",
152: "98",
153: "99",
154: "9a",
155: "9b",
156: "9c",
157: "9d",
158: "9e",
159: "9f",
160: "a0",
161: "a1",
162: "a2",
163: "a3",
164: "a4",
165: "a5",
166: "a6",
167: "a7",
168: "a8",
169: "a9",
170: "aa",
171: "ab",
172: "ac",
173: "ad",
174: "ae",
175: "af",
176: "b0",
177: "b1",
178: "b2",
179: "b3",
180: "b4",
181: "b5",
182: "b6",
183: "b7",
184: "b8",
185: "b9",
186: "ba",
187: "bb",
188: "bc",
189: "bd",
190: "be",
191: "bf",
192: "c0",
193: "c1",
194: "c2",
195: "c3",
196: "c4",
197: "c5",
198: "c6",
199: "c7",
200: "c8",
201: "c9",
202: "ca",
203: "cb",
204: "cc",
205: "cd",
206: "ce",
207: "cf",
208: "d0",
209: "d1",
210: "d2",
211: "d3",
212: "d4",
213: "d5",
214: "d6",
215: "d7",
216: "d8",
217: "d9",
218: "da",
219: "db",
220: "dc",
221: "dd",
222: "de",
223: "df",
224: "e0",
225: "e1",
226: "e2",
227: "e3",
228: "e4",
229: "e5",
230: "e6",
231: "e7",
232: "e8",
233: "e9",
234: "ea",
235: "eb",
236: "ec",
237: "ed",
238: "ee",
239: "ef",
240: "f0",
241: "f1",
242: "f2",
243: "f3",
244: "f4",
245: "f5",
246: "f6",
247: "f7",
248: "f8",
249: "f9",
250: "fa",
251: "fb",
252: "fc",
253: "fd",
254: "fe",
255: "ff",
};
if (/^rgb\(\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\\d|[1-9]\d|1\d{2}|2[0-5]{2},\s*\d|[1-9]\d|1\d{2}|2[0-5]{2}\)$/.test(sRGB)) {
return '#' + sRGB.match(/\d{1,3}/g).map(function (x) {
return rgbObj[x];
}).join('');
} else {
return sRGB;
}
} // 还差数字可能超过255没有考虑,对不起
function rgb2hex(sRGB) {
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f"]
var rgb = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/gi
var res = rgb.exec(sRGB)
if (!res) return sRGB
return res.slice(1).reduce(function (hex, item) {
var fir = Math.floor(item / 16)
var sec = item - fir * 16
console.log(hex)
return hex + arr[fir] + arr[sec]
}, "#")
}
// slice function rgb2hex(sRGB) {if(sRGB.slice(0,4)!=='rgb(' || sRGB.slice(-1)!==')') return sRGB; var rgb = sRGB.slice(4,-1).split(','); if(rgb.length<3) return sRGB; var rs='#'; var num; for(var i=0;i<3;i++){ if(isNaN((num=parseInt(rgb[i])))) return sRGB; if(num>255 || num<0) return sRGB; rs+=num.toString(16).length===1?'0'+num.toString(16):num.toString(16); } return rs; }
function rgb2hex(sRGB) {
var res='#';
var flag=true;
var ary=sRGB.match(/^rgb\((0|[1-9]\d+),\s*(0|[1-9]\d+),\s*(0|[1-9]\d+)\)$/);
if(!ary)return sRGB;
ary.slice(1).forEach(function(k){
if(flag){
flag=k>-1&&k<256;
res+=('0'+(+k).toString(16)).slice(-2);
}
});
return flag?res.toLowerCase():sRGB;
}
在最开始的时候有两种情况没考虑到:
1、小于16的情况,如果小于16,那么转换成十六进制只有一位字母,和题目中的6位小写字母就有出入;
2、不符合格式的rgb。
结果就导致通过率不达标,所以最终参照下网友的代码做了略微的调整。
function rgb2hex(sRGB){
var rgb = sRGB;
var flag = /rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\s*\)/.test(rgb);
var num1,num2,num3;
var str1,str2,str3;
if(!flag){
return rgb;
}else{
var num = rgb.split("(")[1].split(")")[0].split(",");
var str = ["#"];
for(var i=0;i<num.length;i++){
var s = (parseInt(num[i])<16)?"0"+parseInt(num[i]).toString(16):parseInt(num[i]).toString(16);
str.push(s);
}
return str.join("");
}
}