在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 + ">";
  }
));





有一个陷阱:仅当正则表达式可以匹配匹配结果时,它才起作用,因此它不适用于所有情况。 (我在写完答案后才意识到这一点)

而且我不知道它是否真的比您更简单...

10-07 15:09