0

如果我做:

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

这返回:

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

如果我使用:

RegExp.$1

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

我想得到数组["first","second"]。是否可以?

4

3 回答 3

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);

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

于 2012-11-04T18:38:33.950 回答
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存在或填充 - 否则使用循环)

于 2012-11-04T18:39:13.477 回答
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");

检查这个演示


这个解决方案的美妙之处在于您可以使用复杂的返回公式,例如

runRegex("A first sentence. A second sentence", /A\s([^\s]*)(\ssentence)/g, "$1+$2"));
于 2012-11-04T19:01:05.547 回答