Javascript Regex exec()不是';t返回字符串中的第一个匹配项,但返回后续匹配项

Javascript Regex exec()不是';t返回字符串中的第一个匹配项,但返回后续匹配项,javascript,regex,Javascript,Regex,我正在尝试查找字符串中所有出现的颜色。如果我有一个字符串'red#fff green#000000',它将只匹配第二个结果,在本例中为绿色和#000000 // csscolor is just json of all color names const types = { hsl: new RegExp(/(hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3}\%)\s*,\s*(\d{1,3}\%)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\))

我正在尝试查找字符串中所有出现的颜色。如果我有一个字符串'red#fff green#000000',它将只匹配第二个结果,在本例中为绿色和#000000

// csscolor is just json of all color names

const types = {
  hsl: new RegExp(/(hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3}\%)\s*,\s*(\d{1,3}\%)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\))/gi),
  rgb: new RegExp(/(rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}))\)/gi),
  hex: new RegExp(/(#[0-9a-f]{6}|#[0-9a-f]{3})/gi),
  keyword: new RegExp('\\b(' + Object.keys(csscolors).join('|') + ')\\b', 'gi')
};

const execRegex = (re, str) => {
  var match;
  while ((match = re.exec(str)) !== null) {
    console.log('regexp.lastIndex:', re.lastIndex, 
                'index:', match.index,
                'match[0]:', match[0]);
  }
}

const getMatches = (str) => ({
  hsl: types.hsl.test(str) ? execRegex(types.hsl, str) : null,
  rgb: types.rgb.test(str) ? execRegex(types.rgb, str) : null,
  hex: types.hex.test(str) ? execRegex(types.hex, str) : null,
  keyword: types.keyword.test(str) ? execRegex(types.keyword, str) : null
});

getMatches('red #fff green #000000');
输出,缺少红色和#fff:

我用match()测试了正则表达式,它们似乎工作得很好,但match没有为多次出现提供索引


免责声明:RegExp noob

RegExp
test
exec
方法都使用RegExp
lastIndex
属性,因此当调用test时,您将通过第一个匹配,然后使用exec查找第二个匹配


请参阅此相关的堆栈溢出帖子:

是!非常感谢。我通过在execRegexThat中将lastIndex重置为0修复了它。失败的test/exec调用也会重置内容。祝你好运!
regexp.lastIndex: 22 
index: 15 
match[0]: #000000

regexp.lastIndex: 14 
index: 9 
match[0]: green