在javascript中是否有来自.NET的Match.Result,以便使用替换函数,仍然可以使用方便的替换部分逻辑?
或者是否需要提供一个自定义但简单的功能,如下所示,似乎适用于所有情况?
RegExp.matchResult = function (subexp, offset, str, matches) {
return subexp.replace(/\$(\$|&|`|\'|[0-9]+)/g, function (m, p) {
if (p === '$') return '$';
if (p === '`') return str.slice(0, offset);
if (p === '\'') return str.slice(offset + matches[0].length);
if (p === '&' || parseInt(p, 10) <= 0 || parseInt(p, 10) >= matches.length) return matches[0];
return matches[parseInt(p, 10)];
});
};
var subexp; //fill in with substitution expression
var replaceFunc = function () {
return RegExp.matchResult(subexp, arguments[arguments.length - 2], arguments[arguments.length - 1], Array.prototype.slice.call(arguments).slice(0, -2));
};
答案 0 :(得分:1)
你的功能很好看,但我可以想到一个不同的方式:
String.prototype.replaceMatch = function(re, replacement, fn) {
fn = fn || function(p) { return p; };
return this.replace(re, function(m) {
var replaced = m.replace(re, replacement);
var params = Array.prototype.slice.call(arguments);
params.unshift(replaced);
return fn.apply(this, params);
});
};
// Some simple example
alert("foo 42 bar 12345 baz".replaceMatch(
/(\d)(\d*)/g,
"[$1]($2)",
function(replaced, m, a, b) {
return replaced + "<" + a + "," + b + ">";
}
));
&#13;
有一个问题:它只有在正则表达式匹配匹配结果时才有效,所以它并不适用于所有情况。 (我在写完答案后意识到这一点)
我不知道它是否真的符合更简单而不是你的......