.NET中的Match.Result在javascript中

时间:2014-10-21 22:01:47

标签: javascript .net regex

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

1 个答案:

答案 0 :(得分:1)

你的功能很好看,但我可以想到一个不同的方式:

&#13;
&#13;
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;
&#13;
&#13;

有一个问题:它只有在正则表达式匹配匹配结果时才有效,所以它并不适用于所有情况。 (我在写完答案后意识到这一点)

我不知道它是否真的符合更简单而不是你的......