为什么从String.matchAll返回的Iterable Object的长度为1?

问题描述

使用正则表达式从具有matchAll()的字符串中提取匹配项时,生成的Iterable对象(通过spread运算符扩展为Array对象)将显示具有多个成员的嵌套数组。

const regexUpperCaseto = /(?<=\x2d|\x5f)[a-zA-Z0-9]/g;
const testvar1 = [...str.matchAll(regexUpperCaseto)]

当我们打印出testvar1时,它显示

[
  [ '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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...