Javascript regexp模板:仅在括号内的字符串相等时匹配

时间:2012-02-01 15:46:35

标签: javascript regex templates template-engine

我正在为我正在建设的网站使用javascript模板系统,而​​且我遇到了一些问题。

我正在使用以下正则表达式来匹配我的字符串中的部分:

 /(\{\{(#|\^)(.*?)\?\}\}(.*?)\{\{\/(.*?)\?\}\})/

提供一个字符串,如:

 {{#is_user?}} The user is an user {{/user?}}

在声明“user”= true时,显示字符串。当“is_user”设置为false时,不显示该字符串。但是我发现这不允许嵌套的空间:

 {{#is_user?}} The user is an user {{#has_picture?}} and has a picture{{/has_picture?}} {{/user?}}

这将产生以下结果:

The user is an user  {#is_user?}} The user is an user{{/user?}}   

因此意味着匹配在{{#is_user?}}和{{/ has_picture?}}之间找到,因为正则表达式只是检查{{#anystring?}}和{{/ anystring? }}。

现在我的问题是,如果括号之间的两个字符串相等,只有匹配只能在{{#stirngA?}} {{/ stringA?}}时找到匹配。 / p>

1 个答案:

答案 0 :(得分:2)

您可以使用反向引用使正则表达式仅匹配相应的开始标记。

E.g:

/(\{\{(#|\^)(.*?)\?\}\}(.*?)\{\{\/(\3)\?\}\})/

或没有捕获所有群组:

/(?:\{\{(?:#|\^)(.*?)\?\}\}(.*)\{\{\/(?:\1)\?\}\})/

\ 3(或\ 1)将包含第一个(。*?)的值。

rubular上查看。

但这可能无法完全解决您的嵌套匹配问题。虽然您可以使用结果并再次应用正则表达式。也许这足以满足您的特定情况。