如果我做:
"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)
这返回:
["A first sentence", "A second sentence"]
如果我使用:
RegExp.$1
然后我只是得到最后一个第一个括号捕获,所以"second"
.
我想得到数组["first","second"]
。是否可以?
如果我做:
"A first sentence. A second sentence".match(/A\s([^\s]*)\ssentence/g)
这返回:
["A first sentence", "A second sentence"]
如果我使用:
RegExp.$1
然后我只是得到最后一个第一个括号捕获,所以"second"
.
我想得到数组["first","second"]
。是否可以?
您需要循环运行它并构建集合。
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);
我们实际上并没有进行字符串替换,而只是利用了它重复搜索直到找不到更多匹配项的事实。
您必须在没有修饰符的情况下重新运行正则表达式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
存在或填充 - 否则使用循环)
为简单起见,定义
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"));