如果我这样做:
"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)
返回:
["A first sentence", "A second sentence"]
如果我使用:
RegExp.$1
然后我得到最后一个括号捕获,所以"second"
。
我想获得数组["first","second"]
。可能吗?
答案 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"));