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

Regex exec() isn't returning first occurrence in string, but returns subsequent matches

本文关键字:返回 第一个 字符串 exec 不是 Regex      更新时间:2023-09-26

我正在尝试查找字符串中出现的所有颜色。如果我有一个字符串"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:

regexp.lastIndex: 22 
index: 15 
match[0]: #000000
regexp.lastIndex: 14 
index: 9 
match[0]: green

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

免责声明:RegExp noob

RegExp testexec方法都使用RegExp lastIndex属性,因此当您调用test时,您正在遍历第一个匹配,然后使用exec查找第二个匹配。

请参阅这篇相关的Stack Overflow文章:为什么在Javascript中带有全局标志的RegExp会给出错误的结果?