问题描述
使用正则表达式从具有matchAll()的字符串中提取匹配项时,生成的Iterable对象(通过spread运算符扩展为Array对象)将显示具有多个成员的嵌套数组。
const regexUpperCaseto = /(?<=\x2d|\x5f)[a-zA-Z0-9]/g;
const testvar1 = [...str.matchAll(regexUpperCaseto)]
[
[ 's',index: 4,input: 'the-stealth-warrior',groups: undefined ],[ 'w',index: 12,groups: undefined ]
]
同样,作为一个可迭代的对象,我们可以使用for / of循环对返回数组的每个元素进行迭代。
[ 's',groups: undefined ]
[ 'w',groups: undefined ]
但是,一旦我们测试每个成员的长度,它就会返回1。
console.log(testvar1.forEach(x => console.log(x.length)))
此外,当我们尝试访问第0个成员以外的每个数组的成员时,它还会返回 undefined 。
这是怎么回事,每个返回的成员似乎只包含第一个元素?
解决方法
这是正常现象(与matchAll
返回的迭代器无关)。就像从.match()
和.exec()
返回的那些匹配一样,每个匹配都是一个数组对象,其中包含整个匹配,并将捕获的组作为元素。
此外,该数组还具有一些特殊属性,例如.index
,.input
和(自ES2018起).groups
。另请参见Return positions of a regex match() in Javascript?或Contents of a RegExp match。