正则表达式匹配#{}中的名称以用于模板使用

时间:2013-12-11 21:34:02

标签: javascript regex templates prototype

我正在创建一个类别的模板脚本,因此我可以在#{}中放入一个变量名,并将该变量的内容呈现给页面。这是为了进行原型设计。

这样做的一个例子就是有一个名为“fullname”的变量,它包含文本“John Doe”,如果我写这样的html:

<body>
    <p>Hello, #{fullname}! How are you doing?</p>
</body>

将输出:

<body>
    <p>Hello, John Doe! How are you doing?</p>
</body>

我正在使用等同于/#\ {fullname \} / g的正则表达式,这对我来说非常好用,用以下代码编译:

 new RegExp('#\{' + varName + '\}','g');

但是,我发现如果我将普通数字作为变量名称,表达式会产生意外结果(这些不是javascript变量,因此'1'是有效名称。变量名称本身存储在xml中)。如果变量名为“1”,则正则表达式将替换页面上的所有磅数。

所以/#\ {1 \} / g替换文档中的所有#符号。如果我输入0,它会变得非常时髦,几乎取代了所有东西。 2什么都不做。我想知道发生了什么事?

编辑 - 我应该注意写出

/#\{1\}/g

不会导致问题,但是当我使用

new RegExp('#\{1\}','g')

发生此问题。

1 个答案:

答案 0 :(得分:5)

new RexExp对象需要双重转义才能使用:

new RegExp('#\\{' + varName + '\\}', 'g');

否则正则表达式引擎会#{1}而不是#\{1\},因此每个#都会被替换。