我有这样的消息:
{1}
中允许的最多{0}个字符
我有一个使用传递为
的参数创建消息的函数for(var i = 0; i < agrs.length; i++){
reg = new RegExp('\{'+i+'\}', 'gi');
key = key.replace(reg,agrs[i])
}
问题在于它无法使用参数i
来创建reg exp。
实现这一目标的方法是什么?
答案 0 :(得分:54)
您的正则表达式为/{0}/gi
,因为您是从字符串创建的。它不是一个有效的表达方式。
你需要在正则表达式中转义{因为它在regexp语法中有特殊含义,所以它应该是:
new RegExp('\\{'+i+'\\}', 'gi');
是/\\{0\\}/gi
。您需要转义字符串中的转义\\
。
答案 1 :(得分:6)
我强烈建议你使用String.replace()的函数形式来解决你的问题,而不是试图在迭代{0},{1}等的for循环中参数化regexp。 / p>
换句话说,不是寻找'{0}'或'{1}',而只是寻找'{([0-9] +)}'(即{}围绕任意数字,并且将函数传递给replace()函数,根据{}之间的数字智能地替换这些表达式。这使你可以使用一个RegExp文字,你可以写成/ {([0-9] +)} /而不是而不是在字符串中使用转义字符。
这样的事情:
s='the song says {0} little {1} little {2} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
{return args[(+firstmatch)]; }
);
产生
the song says zero little one little two little-endians
请参阅此similar question。
编辑:如果您想单独留下大于args
列表长度的项目,请务必仔细检查参数编号:
s='the song says {0} little {1} little {2} little-endians,\n'+
' {3} little {4} little {5} little-endians';
args=['zero','one','two'];
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch)
{var i = +firstmatch; return i < args.length ? args[i] : wholematch;}
);
产生
the song says zero little one little two little-endians,
{3} little {4} little {5} little-endians
答案 2 :(得分:3)
我认为你的第二行应该是
reg = new RegExp('\{'+i+'\}', 'gi');
但我不知道这是否是你唯一的问题。
答案 3 :(得分:1)
function escapeRegExp(str) {
return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
var re = new RegExp(escapeRegExp(str));