Переделать RegExp под старый синтаксис

Есть функция, которая принимает строку, и добавляет в массив только те значения, которые соответствуют регулярному выражению. ( Возвращает только подстроки, которые начинаются с хэштега, длина которых либо 3, либо 6 символов. То есть такие как #abc или #AA00ef). RegExp который я использую работает, но мне надо переписать его под синтаксис ES6, то есть без использования LookAhead.

function getHexadecimalColors(str) {
    let res = [];
    return str.match(/(?<=#)[0-9a-f]{6}|(?<=#)[0-9a-f]{3}(?![0-9a-f])/ig);
}

Ответы (2 шт):

Автор решения: Wiktor Stribiżew

Используйте захватывающую подмаску:

/#([0-9a-f]{3}(?:[0-9a-f]{3})?)(?![0-9a-f])/ig

См. пример работы регулярного выражения. Подробности*:

  • # - символ #
  • ([0-9a-f]{3}(?:[0-9a-f]{3})?) - три символа, используемых для обозначения шестнадцатеричных чисел, и затем ещё три таких символа (если есть)
  • (?![0-9a-f]) - сразу после текущей позиции не должно быть символа, используемого для обозначения шестнадцатеричных чисел.

Пример кода:

function getHexadecimalColors(str) {
    var res = [],
      re = /#([0-9a-f]{3}(?:[0-9a-f]{3})?)(?![0-9a-f])/ig,
      m;
    while (m = re.exec(str)) {
      res.push(m[1]);
    }
    return res;
}

console.log(getHexadecimalColors('То есть такие как #abc или #AA00ef)'));

→ Ссылка
Автор решения: Qwertiy

Вообще, цвета могут быть ещё в 4 и 8 знаков (альфаканал) - возможно, их тоже стоит добавить.

function getHexadecimalColors(str) {
  var res = str.match(/#([0-9a-f]{3}|[0-9a-f]{6})(?![0-9a-f])/gi)
  return res && res.map(function (x) { return x.slice(1) });
}

console.log(getHexadecimalColors("a #12eq ##eeeeee#ff8#fffqqq#000abc#fff6"))

→ Ссылка