我有一个包含一个或多个占位符的字符串(来自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与否)?
答案 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
)之间进行转换。这一切都取决于您需要的解决方案的强大程度。