3

为什么

"$1 $2 $3".match(/\$(\d+)/g)

返回

 ["$1", "$2", "$2"]

, 不是

 ["1", "2", "3"]

?

如果我删除全局标志,它将给我匹配和捕获的匹配:

["$1", "1"]

但只有一个。

有没有办法进行 reg ex 捕获而不给我这个?

即使在 $ 周围加上非捕获括号也会给我相同的结果,例如:

"$1 $2 $3".match(/(?:\$)(\d+)/g)
4

1 回答 1

6

如果您在正则表达式中使用捕获组(例如,parens),那么您无法g按照您尝试的方式获得与标志的多个匹配项,因为该.match()函数无法返回二维数据(捕获组列表每次匹配)。它本来可以设计为这样做的,但是为了获取该信息并非如此,您必须循环并.exec()多次调用,每次调用它时,您都会从每个连续匹配中获取所有数据。

使用如下所示获取此数据.exec()

var str = "$1 $2 $3", matches;
var allMatches = [];
var reg = /\$(\d+)/g;

while (matches = reg.exec(str)) {
    // matches[1] is each successive match here from your captured group
    allMatches.push(matches[1]);
}
// allMatches will be what you wanted ["1", "2", "3"]
于 2012-09-21T14:45:39.000 回答