RegEx:匹配{{#if}} ... {{/ if}}代码

时间:2014-11-07 16:48:58

标签: regex tags handlebars.js

通过正则表达式仅匹配{{#if}}...{{/if}}个标签很容易。但是,如果此标记的内容可能还包含各种IF标记,我该怎么办?

{{#if name}}
    Hello {{name}},
    {{#if age}}
        You are {{age}} years old.
    {{/if}}
{{/if}}

我的方法失败了:http://www.regexr.com/39s9k

/(?:{{#if(?: *))(.*)(?: *)}}([\s\S]*?)(?:{{\/if}})/g

它被假设匹配整个IF块。从上到下,包括中间的IF

1 个答案:

答案 0 :(得分:0)

对于仍在寻找此问题解决方案的所有人: 我无法用JS-RegEx做到这一点,所以我这样做了:

  • 搜索字符串

    中的所有{{#if ...}} - 标签
    /(?:{{#if(?: *))(.*)(?: *)}}/g
    
  • 将匹配项替换为{##0##},每个标记都有一个索引。同时将语句($1)保存到数组中,以便稍后通过索引访问它。

  • 遍历数组向后并为每个项目执行此操作:

    str = str.replace(new RegExp('{##'+i+'##}([\\s\\S]*?){{\\/if}}', 'g'), "{##"+i+"##}$1{##/"+ i +"##}");
    

    它的作用是用匹配的数字替换所有{{/if}} - 结束标记。 对于此步骤,向后迭代非常重要。

  • 现在您可以使用

    匹配/替换标签
    /{##(\d)##}([\s\S]*){##\/\1##}/g