【问题标题】:Javascript regexp templates: only match when string inside brackets is equalJavascript 正则表达式模板:仅当括号内的字符串相等时才匹配
【发布时间】:2012-02-01 15:46:34
【问题描述】:

我正在为我正在构建的网站使用 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?}} 时找到匹配。

【问题讨论】:

    标签: javascript regex templates template-engine


    【解决方案1】:

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

    例如:

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

    或不捕获所有组:

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

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

    rubular 上查看。

    但这可能无法完全解决您的嵌套匹配问题。尽管您可以使用结果并再次应用正则表达式。对于您的具体情况,这可能已经足够了。

    【讨论】:

    • 非常感谢,我仍然需要在实践中对其进行测试,但现在看来它正是我所需要的。还要感谢您提供的 rubular 链接,我正在寻找类似的东西。
    猜你喜欢
    • 2017-09-15
    • 2017-10-16
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-08-29
    相关资源
    最近更新 更多