Regex exec()不是't返回字符串中的第一个匹配项,但返回后续匹配项
Regex exec() isn't returning first occurrence in string, but returns subsequent matches
我正在尝试查找字符串中出现的所有颜色。如果我有一个字符串"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 test
和exec
方法都使用RegExp lastIndex
属性,因此当您调用test时,您正在遍历第一个匹配,然后使用exec查找第二个匹配。
请参阅这篇相关的Stack Overflow文章:为什么在Javascript中带有全局标志的RegExp会给出错误的结果?
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- Javascript:表单验证getElementById仅返回第一个id元素
- JS在隐藏未定义的值后仅从数组中返回第一个id的值
- 我的设备后退按钮工作不正常,它转到第一个html,但返回到第二个html
- 在ajax html返回中调用ajax会阻止第一个ajax脚本进一步工作
- 在 javascript 中返回正则表达式的每个匹配中捕获的第一个组
- Javascript 多维数组返回第一个值,然后失败
- 当移动到最后一个li时,返回到第一个li(使用Jquery滚动到下一个)
- 为什么定时器setTimeout返回第一个值“;2〃;.代码下方的
- 如果我在一个函数中返回两次,第二个会覆盖第一个吗?
- Ajax:第一个Post很棒,第二个Post返回URL中的数据
- JQuery - select val()只返回下拉列表的第一个值
- Javascript中的全局变量返回到它的第一个值
- 为什么JavaScript结果总是返回第一个值
- 为什么我的 .data() 函数返回 [ 而不是我的数组的第一个值
- 为什么使用& 0"使用三元运算符返回第一个值
- 逗号操作符返回参数列表中的第一个值,而不是第二个值