如何用javascript中的实际值替换.NET字符串占位符?

时间:2010-12-13 14:27:51

标签: javascript regex

我有一个包含一个或多个占位符的字符串(来自ASP.NET)。在.NET中我使用string.Format()方法用实际值替换占位符:

var str = "aaa {0} bbb {1} ccc {2:0.0}";
var result = string.Format(str, new [] {1, 2, 33.123});

现在我必须在javascript中做同样的事情,但我正在努力使用正则表达式。以下函数适用于像“{0}”这样的简单占位符,但对于像“{3:0.0}”这样的更复杂的占位符则失败:

function FormatString(txt, args) {
  for (i = 0; i < args.length; i++) {
    txt = txt.replace('{' + i + '}', args[i]);
  }
  return txt;
}

//e.g:
FormatString("aa {0} bb {1} cc", [1, 2]);
// returns "aa 1 bb 2 cc"

对于复杂的占位符,我尝试修改我的函数以使用正则表达式,但到目前为止,我没有提出一个有效的RegExp。这就是我试过的:

function FormatString2(txt, args) {
  for (i = 0; i < args.length; i++) {
    txt = txt.replace(new RegExp('{' + i + '.*}'), args[i]);
  }
  return txt;
}

// does not work correctly, i.e:
FormatString2("aa {0:0.0} bb {1} cc", [1, 2]);
// returns "aa 1 cc" instead of "aa 1 bb 2 cc"

任何提示如何在javascript中正确替换这些.NET占位符(使用RegExp与否)?

2 个答案:

答案 0 :(得分:1)

好了一些谷歌后,我想我找到了一个似乎有效的解决方案:

function FormatString2(txt, args) {
  for (i = 0; i < args.length; i++) {
    txt = txt.replace(new RegExp('{' + i + '[^}]*}'), args[i]);
  }
  return txt;
}

答案 1 :(得分:0)

JavaScript中有许多sprintf实现 - 但是如果你更喜欢这种语法,那么你会想要这样的东西(未经测试):

// Define unchanging values outside of any function call:
var formatter = /{(\d+)([^}]*)}/g;
// If the colon is the flagging character, then you'll want:
// /{(\d+):?([^}]*)}/g
var modes = function(mode) {
  switch (mode) {
    case "0.0": 
      return function(str) { /* do something with the string here */ };
    // Additional cases go here.
    default:
      return function(str) { return str; };
  }
};
function replacer(key, mode) {
  return modes(mode)(args[key])
}

function FormatString(txt, args) {
  var l = args.length, i = 1;
  while (i < l) {
    txt = txt.replace(formatter, replacer);
  }
  return txt;
}

您还可以使用对象文字而不是函数,并在replacer中执行标记检查,以便在0.0和密钥(如decimal-number)之间进行转换。这一切都取决于您需要的解决方案的强大程度。