如何在javascript RegExp中获取所有括号

时间:2012-11-04 18:33:03

标签: javascript regex

如果我这样做:

"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)

返回:

["A first sentence", "A second sentence"]

如果我使用:

RegExp.$1

然后我得到最后一个括号捕获,所以"second"

我想获得数组["first","second"]。可能吗?

3 个答案:

答案 0 :(得分:2)

您需要在循环中运行它,然后构建集合。

var str = "A first sentence. A second sentence",
    regex = /A\s([^\s]*)\ssentence/g,
    result = [],
    match;

while (match = regex.exec(str)) {
    result.push(match[1]);
}

console.log(result);

因为正则表达式是全局g,所以它会记住最后一个匹配的位置,并在下次使用正则表达式时从那里开始。因此循环将继续,直到找不到更多匹配。

在循环内部,我们只需将子组添加到result数组。


有些人喜欢将.replace用于此目的。

var str = "A first sentence. A second sentence",
    regex = /A\s([^\s]*)\ssentence/g,
    result = [];

str.replace(regex, function(str, g1) {
    result.push(g1);
});

console.log(result);

我们实际上并没有进行字符串替换,而只是利用它重复搜索直到找不到更多匹配的事实。

答案 1 :(得分:1)

您必须重新运行正则表达式而不使用g修饰符来获取子模式。类似的东西:

"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)
    .map(function(a) {return a.match(/A\s([^\s]*)\ssentence/);})

(假设Array.prototype.map存在或填充 - 否则使用循环

答案 2 :(得分:1)

为简单起见,请定义

function runRegex(str, pat, ret){ 
  return str.match(pat).map(function(a){ 
    a.match(pat); var b; eval("with(RegExp) b = " + ret + ";"); return b;
  });
}

并将其与所需参数一起使用

runRegex("A first sentence. A second sentence", /A\s([^\s]*)\ssentence/g, "$1");

检查this demo


此解决方案的优点在于您可以使用复杂的返回公式,例如

runRegex("A first sentence. A second sentence", /A\s([^\s]*)(\ssentence)/g, "$1+$2"));