1

我有以下和regex模板。templateunderscore.js

问题是正则表达式interpolate无法正常工作,什么是正确的正则表达式?

正则表达式

var settings = {
    evaluate: /\{\{\#([\s\S]+?)\}\}/g,
    interpolate: /\{\{[a-zA-Z](.+?)\}\}/g
};

模板

{{# if ( item ) { }}
    {{ item.title }}
{{# } }}
4

1 回答 1

1

模板编译器将使用表达式中的最后一个捕获组来构建模板的 JavaScript 形式。在您的情况下,interpolate遗嘱(如 Jerry 所述)忽略第一个字母字符,因此最终会在模板参数中{{ab}}查找。b您的正则表达式也不考虑前导空格。你会想要更像这样的东西:

/\{\{\s*([a-zA-Z](?:.+?))\s*\}\}/g

或者更好,只需省略原始组而不是将其转换为非捕获组:

/\{\{\s*([a-zA-Z].+?)\s*\}\}/g

或者更好的是,直奔问题的核心,准确地说出你的意思:

/\{\{([^#].*?)\}\}/g

我认为导致您使用原始正则表达式的问题interpolate是之前检查过evaluateinterpolate该顺序在正在查找<%= ... %>evaluate正在查找时是有意义的<% ... %>(即正在使用默认分隔符)。在您的情况下,您需要一些额外的[^#]技巧来绕过正则表达式检查顺序。

同样,我们可以简化您的evaluate正则表达式:

/\{\{#(.+?)\}\}/g

演示:http: //jsfiddle.net/ambiguous/V6rv2/

我还建议您添加一个escape完整的模式。

于 2013-05-15T23:30:41.143 回答