要求:
将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff

  1. rgb 中每个 , 后面的空格数量不固定
  2. 十六进制表达式使用六位小写字母
  3. 如果输入不符合 rgb 格式,返回原始输入

测试用例:
rgb2hex("rgb(255, 255, 255) ") //#ffffff
rgb2hex("rgb(100, 0, 255) ") //#6400ff
异常测试用例
rgb2hex("rgb(100 ") //rgb(100
rgb2hex("rgb(100, 0, 999) ") //rgb(100,0,999)

代码实现:

function rgb2hex(sRGB = "") {
  sRGB = sRGB.replace(/ /g, ""); //  去掉多余空格

  // 正则表达式,使用(),
  // 当调用string.match方法是,数组1/2/3分别对应匹配值
  let reg = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/i;
  let match = sRGB.match(reg);
  if (!match) return sRGB;  // 非法,直接返回

  let numList = [];
  for (let i = 1; i < 4; i++) {
    let num = parseInt(match[i]);
    if (num > 255) return sRGB;   // >255,非法,直接返回
    numList.push(num);
  }

  let ret = numList.reduce(function (pre, cur) {
    let nCur = cur.toString(16);
    if (nCur.length === 1) nCur = "0" + nCur;

    return pre + nCur;
  }, "#");
  return ret;
}

console.log(rgb2hex("rgb(255, 255, 255) "));  //#ffffff
console.log(rgb2hex("rgb(100, 0, 255) "));    //#6400ff
console.log(rgb2hex("rgb(100 "));             //rgb(100
console.log(rgb2hex("rgb(100, 0, 999) "));    //rgb(100,0,999)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐