在javascript中将变量传递给regexp

时间:2009-01-28 12:52:16

标签: javascript regex

  

可能重复:
  Escape string for use in Javascript regex

我有这样的消息:

  

{1}

中允许的最多{0}个字符

我有一个使用传递为

的参数创建消息的函数
for(var i = 0; i < agrs.length; i++){
    reg = new RegExp('\{'+i+'\}', 'gi');
    key = key.replace(reg,agrs[i])
}

问题在于它无法使用参数i来创建reg exp。

实现这一目标的方法是什么?

4 个答案:

答案 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));   

请参阅:Escape string for use in Javascript regex