奇怪的替换行为

时间:2016-10-21 14:10:31

标签: javascript string format

我尝试在JS中创建一个String.format函数,就像C#一样,所以我不必做foo + ", " + bar并做"{0}, {1}".format(foo, bar);我只有使用{我得到了一些非常好的结果{1}}。

{0}

除了String.prototype.format = function() { var replacement = ""; for (var i = 0; i < arguments.length; i++) { replacement += this.replace("{" + i + "}", arguments[i]); } return replacement; }; 执行:"{0} {1}".format("foo", "bar");或SyntaxError之外。尽管如此,我从来没有像这样更换任何错误。

2 个答案:

答案 0 :(得分:2)

解决此问题的最佳方法是使用replace上的函数回调和全局替换搜索:

&#13;
&#13;
Object.defineProperty(String.prototype, "format", {
  value: function() {
    var args = arguments;
    return this.replace(/\{(\d+)\}/g, function(m, c0) {
      return args[c0] || "";
    });
  }
});
console.log("testing {0}, {1}, {2}".format("one", "two", "three"));
&#13;
&#13;
&#13;

这有几个原因比重复调用replace更好:

  • 您不必重复重新扫描整个字符串
  • 让替换{n}不会造成麻烦。

请注意,我使用Object.defineProperty来避免在String.prototype上创建可枚举的属性。

正则表达式的工作原理是捕获{}之间的任何数字。然后,我们使用生成的捕获来查找给予arguments的原始String.prototype.format的替换。

请注意|| ""。如果没有48个参数,那将用零替换{47}。如果您希望保留{47},请将其更改为|| m

在ES2015及以上版本中,我们这样做:

&#13;
&#13;
Object.defineProperty(String.prototype, "format", {
  value: function(...args) {
    return this.replace(/\{(\d+)\}/g, (m, c0) => args[c0] || "");
  }
});
console.log("testing {0}, {1}, {2}".format("one", "two", "three"));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我认为这会对你有帮助。

String.prototype.format = function() {
    var replacement = this;
    for (var i = 0; i < arguments.length; i++) {
        var regexp = new RegExp('\\{'+i+'\\}', 'gi');
        replacement = replacement .replace(regexp, arguments[i]);
    }
    return replacement;
};