在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));
};
最佳答案
您的函数看起来不错,但是我可以想到另一种方式:
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 + ">";
}
));
有一个陷阱:仅当正则表达式可以匹配匹配结果时,它才起作用,因此它不适用于所有情况。 (我在写完答案后才意识到这一点)
而且我不知道它是否真的比您更简单...